/**
 * Employee Management Types
 * 사원관리 타입 정의
 */

// ===== 기본 Enum/상수 타입 =====

/** 사원 상태 */
export type EmployeeStatus = 'active' | 'leave' | 'resigned';

/** 상태 라벨 매핑 */
export const EMPLOYEE_STATUS_LABELS: Record<EmployeeStatus, string> = {
  active: '재직',
  leave: '휴직',
  resigned: '퇴직',
};

/** 상태 뱃지 색상 */
export const EMPLOYEE_STATUS_COLORS: Record<EmployeeStatus, string> = {
  active: 'bg-green-100 text-green-800',
  leave: 'bg-yellow-100 text-yellow-800',
  resigned: 'bg-gray-100 text-gray-800',
};

/** 고용 형태 */
export type EmploymentType = 'regular' | 'contract' | 'parttime' | 'intern';

export const EMPLOYMENT_TYPE_LABELS: Record<EmploymentType, string> = {
  regular: '정규직',
  contract: '계약직',
  parttime: '파트타임',
  intern: '인턴',
};

/** 성별 */
export type Gender = 'male' | 'female';

export const GENDER_LABELS: Record<Gender, string> = {
  male: '남성',
  female: '여성',
};

/** 사용자 권한 */
export type UserRole = 'admin' | 'manager' | 'user';

export const USER_ROLE_LABELS: Record<UserRole, string> = {
  admin: '관리자',
  manager: '매니저',
  user: '일반 사용자',
};

/** 사용자 계정 상태 */
export type UserAccountStatus = 'active' | 'inactive' | 'pending';

export const USER_ACCOUNT_STATUS_LABELS: Record<UserAccountStatus, string> = {
  active: '활성',
  inactive: '비활성',
  pending: '대기',
};

// ===== 부서/직책 관련 =====

/** 부서-직책 매핑 (한 사원이 여러 부서에 소속 가능) */
export interface DepartmentPosition {
  id: string;
  departmentId: string;
  departmentName: string;
  positionId: string;
  positionName: string;
}

// ===== 급여 계좌 정보 =====

export interface BankAccount {
  bankName: string;
  accountNumber: string;
  accountHolder: string;
}

// ===== 주소 정보 =====

export interface Address {
  zipCode: string;
  address1: string; // 기본 주소
  address2: string; // 상세 주소
}

// ===== 사용자 정보 =====

export interface UserInfo {
  userId: string;
  password?: string; // 등록/수정 시에만 사용
  role: UserRole;
  accountStatus: UserAccountStatus;
}

// ===== 메인 Employee 인터페이스 =====

export interface Employee {
  id: string;
  userId?: number; // users 테이블 ID (담당자 선택 등에 사용)

  // 기본 정보 (필수)
  name: string;

  // 기본 정보 (선택)
  residentNumber?: string; // 주민등록번호
  phone?: string;
  email?: string;
  salary?: number; // 연봉
  bankAccount?: BankAccount;

  // 선택적 필드 (설정에 따라 표시)
  profileImage?: string;
  employeeCode?: string; // 사원코드
  gender?: Gender;
  address?: Address;

  // 인사 정보
  hireDate?: string; // YYYY-MM-DD
  employmentType?: EmploymentType;
  rank?: string; // 직급 (예: 사원, 대리, 과장 등)
  status: EmployeeStatus;
  departmentPositions: DepartmentPosition[]; // 부서/직책 (복수 가능)
  clockInLocation?: string; // 출근 위치
  clockOutLocation?: string; // 퇴근 위치
  resignationDate?: string; // 퇴사일
  resignationReason?: string; // 퇴직사유
  concurrentPosition?: string; // 겸직 직위
  concurrentReason?: string; // 겸직 사유

  // 사용자 정보 (시스템 계정)
  userInfo?: UserInfo;

  // 메타 정보
  createdAt: string;
  updatedAt: string;
}

// ===== 폼 데이터 타입 =====

export interface EmployeeFormData {
  // 기본 정보
  name: string;
  residentNumber: string;
  phone: string;
  email: string;
  salary: string; // 입력 시 문자열
  bankAccount: BankAccount;

  // 선택적 필드
  profileImage: string;
  employeeCode: string;
  gender: Gender | '';
  address: Address;

  // 인사 정보
  hireDate: string;
  employmentType: EmploymentType | '';
  rank: string;
  status: EmployeeStatus;
  departmentPositions: DepartmentPosition[];
  clockInLocation: string; // 출근 위치
  clockOutLocation: string; // 퇴근 위치
  resignationDate: string; // 퇴사일
  resignationReason: string; // 퇴직사유

  // 사용자 정보
  hasUserAccount: boolean;
  userId: string;
  password: string;
  confirmPassword: string;
  role: UserRole;
  accountStatus: UserAccountStatus;
}

// ===== 필드 설정 타입 =====

export interface FieldSettings {
  // 사원 상세 필드
  showProfileImage: boolean;
  showEmployeeCode: boolean;
  showGender: boolean;
  showAddress: boolean;

  // 인사 정보 필드
  showHireDate: boolean;
  showEmploymentType: boolean;
  showRank: boolean;
  showStatus: boolean;
  showDepartment: boolean;
  showPosition: boolean;
  showClockInLocation: boolean; // 출근 위치
  showClockOutLocation: boolean; // 퇴근 위치
  showResignationDate: boolean; // 퇴사일
  showResignationReason: boolean; // 퇴직사유
}

export const DEFAULT_FIELD_SETTINGS: FieldSettings = {
  showProfileImage: true,
  showEmployeeCode: true,
  showGender: true,
  showAddress: true,
  showHireDate: true,
  showEmploymentType: true,
  showRank: true,
  showStatus: true,
  showDepartment: true,
  showPosition: true,
  showClockInLocation: true,
  showClockOutLocation: true,
  showResignationDate: true,
  showResignationReason: true,
};

// ===== 필터/검색 타입 =====

export type EmployeeFilterType = 'all' | 'hasUserId' | 'noUserId';

export const EMPLOYEE_FILTER_OPTIONS: { value: EmployeeFilterType; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'hasUserId', label: '사용자 아이디 보유' },
  { value: 'noUserId', label: '사용자 아이디 미보유' },
];

// ===== CSV 업로드 타입 =====

export interface CSVEmployeeRow {
  name: string;
  phone?: string;
  email?: string;
  departmentName?: string;
  positionName?: string;
  hireDate?: string;
  status?: string;
  // 추가 필드들...
}

export interface CSVValidationResult {
  row: number;
  data: CSVEmployeeRow;
  isValid: boolean;
  errors: string[];
}

// ===== 통계 타입 =====

export interface EmployeeStats {
  activeCount: number;
  leaveCount: number;
  resignedCount: number;
  averageTenure: number; // 평균 근속년수
}

// ===== 다이얼로그 타입 =====

export type DialogMode = 'create' | 'edit' | 'view';

export interface EmployeeDialogProps {
  open: boolean;
  onOpenChange: (open: boolean) => void;
  mode: DialogMode;
  employee?: Employee;
  onSave: (data: EmployeeFormData) => void;
  fieldSettings: FieldSettings;
}

// ===== 정렬 옵션 =====

export type SortField = 'name' | 'employeeCode' | 'department' | 'hireDate' | 'status';
export type SortDirection = 'asc' | 'desc';

export interface SortOption {
  field: SortField;
  direction: SortDirection;
  label: string;
}

export const SORT_OPTIONS: SortOption[] = [
  { field: 'name', direction: 'asc', label: '이름 (오름차순)' },
  { field: 'name', direction: 'desc', label: '이름 (내림차순)' },
  { field: 'hireDate', direction: 'desc', label: '입사일 (최신순)' },
  { field: 'hireDate', direction: 'asc', label: '입사일 (오래된순)' },
  { field: 'employeeCode', direction: 'asc', label: '사원코드 (오름차순)' },
];
