/// 사용자(User) 도메인 엔티티.
class UserAccount {
  UserAccount({
    this.id,
    required this.employeeNo,
    required this.employeeName,
    this.email,
    this.mobileNo,
    this.group,
    this.isActive = true,
    this.isDeleted = false,
    this.note,
    this.forcePasswordChange = false,
    this.passwordUpdatedAt,
    this.createdAt,
    this.updatedAt,
  });

  final int? id;
  final String employeeNo;
  final String employeeName;
  final String? email;
  final String? mobileNo;
  final UserGroup? group;
  final bool isActive;
  final bool isDeleted;
  final String? note;
  final bool forcePasswordChange;
  final DateTime? passwordUpdatedAt;
  final DateTime? createdAt;
  final DateTime? updatedAt;

  /// 선택된 속성만 변경한 새 인스턴스를 반환한다.
  UserAccount copyWith({
    int? id,
    String? employeeNo,
    String? employeeName,
    String? email,
    String? mobileNo,
    UserGroup? group,
    bool? isActive,
    bool? isDeleted,
    String? note,
    bool? forcePasswordChange,
    DateTime? passwordUpdatedAt,
    DateTime? createdAt,
    DateTime? updatedAt,
  }) {
    return UserAccount(
      id: id ?? this.id,
      employeeNo: employeeNo ?? this.employeeNo,
      employeeName: employeeName ?? this.employeeName,
      email: email ?? this.email,
      mobileNo: mobileNo ?? this.mobileNo,
      group: group ?? this.group,
      isActive: isActive ?? this.isActive,
      isDeleted: isDeleted ?? this.isDeleted,
      note: note ?? this.note,
      forcePasswordChange: forcePasswordChange ?? this.forcePasswordChange,
      passwordUpdatedAt: passwordUpdatedAt ?? this.passwordUpdatedAt,
      createdAt: createdAt ?? this.createdAt,
      updatedAt: updatedAt ?? this.updatedAt,
    );
  }
}

/// 사용자에 연결된 그룹 정보.
class UserGroup {
  UserGroup({required this.id, required this.groupName});

  final int id;
  final String groupName;
}

/// 사용자 생성/수정 입력 모델.
class UserInput {
  UserInput({
    required this.employeeNo,
    required this.employeeName,
    required this.groupId,
    this.email,
    this.mobileNo,
    this.isActive = true,
    this.forcePasswordChange,
    this.password,
    this.note,
  });

  final String employeeNo;
  final String employeeName;
  final int groupId;
  final String? email;
  final String? mobileNo;
  final bool isActive;
  final bool? forcePasswordChange;
  final String? password;
  final String? note;

  /// API 요청 바디로 직렬화한다.
  Map<String, dynamic> toPayload() {
    return {
      'employee_id': employeeNo,
      'name': employeeName,
      'group_id': groupId,
      if (email != null) 'email': email,
      if (mobileNo != null) 'phone': mobileNo,
      'is_active': isActive,
      if (forcePasswordChange != null)
        'force_password_change': forcePasswordChange,
      if (password != null) 'password': password,
      if (note != null) 'note': note,
    };
  }
}

/// 자기 정보 수정 입력 모델.
class UserProfileUpdateInput {
  const UserProfileUpdateInput({
    this.email,
    this.phone,
    this.password,
    this.currentPassword,
  });

  final String? email;
  final String? phone;
  final String? password;
  final String? currentPassword;

  /// 자기 정보 수정 요청 바디를 직렬화한다.
  Map<String, dynamic> toPayload() {
    return {
      if (email != null) 'email': email,
      if (phone != null) 'phone': phone,
      if (password != null) 'password': password,
      if (currentPassword != null) 'current_password': currentPassword,
    };
  }
}
