/**
 * 휴가관리 타입 정의
 * 3개 메인 탭: 휴가 사용현황, 휴가 부여현황, 휴가 신청현황
 */

// ===== 메인 탭 타입 =====
export type MainTabType = 'usage' | 'grant' | 'request';

// 휴가 유형 (부여용)
export type VacationType = 'annual' | 'monthly' | 'reward' | 'condolence' | 'other';

// 휴가 유형 (신청용) - Leave API와 일치
export type LeaveType = 'annual' | 'half_am' | 'half_pm' | 'sick' | 'family' | 'maternity' | 'parental';

// 조정 가능한 휴가 유형 (VacationAdjustDialog에서 사용)
export type AdjustableVacationType = 'annual' | 'monthly' | 'reward' | 'other';

// 필터 옵션
export type FilterOption = 'all' | 'hasVacation' | 'noVacation';

export const FILTER_OPTIONS: { value: FilterOption; label: string }[] = [
  { value: 'all', label: '전체' },
  { value: 'hasVacation', label: '잔여휴가 있음' },
  { value: 'noVacation', label: '잔여휴가 없음' },
];

// 정렬 옵션
export type SortOption = 'rank' | 'deptAsc' | 'deptDesc' | 'nameAsc' | 'nameDesc';

// 휴가 신청 상태
export type RequestStatus = 'pending' | 'approved' | 'rejected';

// ===== 탭 1: 휴가 사용현황 =====
// 휴가 유형별 상세 정보
export interface VacationTypeDetail {
  total: number;
  used: number;
  remaining: number;
}

// 테이블 컬럼: 부서 | 직책 | 이름 | 직급 | 입사일 | 기본 | 부여 | 사용 | 잔여
export interface VacationUsageRecord {
  id: string;
  employeeId: string;
  employeeName: string;
  department: string;
  position: string;        // 직책
  rank: string;            // 직급
  hireDate: string;        // 입사일
  baseVacation: string;    // 기본 (예: "15일")
  grantedVacation: string; // 부여 (예: "3일")
  usedVacation: string;    // 사용 (예: "12일3시간")
  remainingVacation: string; // 잔여 (예: "2일5시간")
  // 휴가 유형별 상세 (조정 다이얼로그용)
  annual: VacationTypeDetail;
  monthly: VacationTypeDetail;
  reward: VacationTypeDetail;
  other: VacationTypeDetail;
  createdAt: string;
  updatedAt: string;
}

// ===== 탭 2: 휴가 부여현황 =====
// 테이블 컬럼: 부서 | 직책 | 이름 | 직급 | 유형 | 부여일 | 부여휴가일수 | 사유
export interface VacationGrantRecord {
  id: string;
  employeeId: string;
  employeeName: string;
  department: string;
  position: string;        // 직책
  rank: string;            // 직급
  vacationType: VacationType; // 유형
  grantDate: string;       // 부여일
  grantDays: number;       // 부여휴가일수
  reason?: string;         // 사유
  createdAt: string;
  updatedAt: string;
}

// ===== 탭 3: 휴가 신청현황 =====
// 테이블 컬럼: 부서 | 직책 | 이름 | 직급 | 휴가기간 | 휴가일수 | 상태 | 신청일
export interface VacationRequestRecord {
  id: string;
  employeeId: string;
  employeeName: string;
  department: string;
  position: string;        // 직책
  rank: string;            // 직급
  startDate: string;       // 휴가기간 시작
  endDate: string;         // 휴가기간 종료
  vacationDays: number;    // 휴가일수
  status: RequestStatus;   // 상태
  requestDate: string;     // 신청일
  vacationType?: VacationType;
  createdAt: string;
  updatedAt: string;
}

// ===== 폼 데이터 =====
export interface VacationFormData {
  employeeId: string;
  vacationType: VacationType;
  days: number;
  memo?: string;
}

export interface VacationGrantFormData {
  employeeId: string;
  vacationType: VacationType;
  grantDate: string;
  grantDays: number;
  reason?: string;
}

export interface VacationRequestFormData {
  employeeId: string;
  leaveType: LeaveType;
  startDate: string;
  endDate: string;
  vacationDays: number;
}

export interface VacationAdjustment {
  vacationType: VacationType;
  adjustment: number;
}

export interface VacationTypeConfig {
  id: string;
  name: string;
  type: VacationType;
  isActive: boolean;
  description?: string;
}

export interface EmployeeOption {
  id: string;
  name: string;
  department: string;
  position: string;
  rank: string;
}

// ===== 상수 정의 =====

export const MAIN_TAB_LABELS: Record<MainTabType, string> = {
  usage: '휴가 사용현황',
  grant: '휴가 부여현황',
  request: '휴가 신청현황',
};

export const VACATION_TYPE_LABELS: Record<VacationType, string> = {
  annual: '연차',
  monthly: '월차',
  reward: '포상휴가',
  condolence: '경조사',
  other: '기타',
};

export const LEAVE_TYPE_LABELS: Record<LeaveType, string> = {
  annual: '연차',
  half_am: '오전반차',
  half_pm: '오후반차',
  sick: '병가',
  family: '경조사',
  maternity: '출산휴가',
  parental: '육아휴직',
};

export const VACATION_TYPE_COLORS: Record<VacationType, string> = {
  annual: 'blue',
  monthly: 'green',
  reward: 'purple',
  condolence: 'pink',
  other: 'orange',
};

export const REQUEST_STATUS_LABELS: Record<RequestStatus, string> = {
  pending: '대기',
  approved: '승인',
  rejected: '반려',
};

export const REQUEST_STATUS_COLORS: Record<RequestStatus, string> = {
  pending: 'bg-yellow-100 text-yellow-800',
  approved: 'bg-green-100 text-green-800',
  rejected: 'bg-red-100 text-red-800',
};

export const SORT_OPTIONS: { value: SortOption; label: string }[] = [
  { value: 'rank', label: '직급순' },
  { value: 'deptAsc', label: '부서명 오름차순' },
  { value: 'deptDesc', label: '부서명 내림차순' },
  { value: 'nameAsc', label: '이름 오름차순' },
  { value: 'nameDesc', label: '이름 내림차순' },
];

export const DEFAULT_VACATION_TYPES: VacationTypeConfig[] = [
  { id: '1', name: '연차', type: 'annual', isActive: true, description: '연간 유급 휴가' },
  { id: '2', name: '월차', type: 'monthly', isActive: true, description: '월간 유급 휴가' },
  { id: '3', name: '포상휴가', type: 'reward', isActive: true, description: '성과에 따른 포상 휴가' },
  { id: '4', name: '경조사', type: 'condolence', isActive: true, description: '경조사 휴가' },
  { id: '5', name: '기타', type: 'other', isActive: true, description: '기타 휴가' },
];