export type LeaveStatus = 'Pending' | 'Pending Review' | 'HOD Approved' | 'Pending HOS Approval' | 'HOS Approved' | 'Approved' | 'Rejected' | 'Cancelled';
export type LeaveTypeKey = 'Annual' | 'Sick' | 'Maternity' | 'Paternity' | 'Bereavement' | 'Unpaid';

export interface LeavePolicy {
  type: LeaveTypeKey;
  label: string;
  entitlement: number;
  internEntitlement: number;
  accrualRate: number;
  maxCarryover: number;
  unpaidAllowed: boolean;
  notes: string;
  color: string;
  icon: string;
}

export interface LeaveBalance {
  employeeId: string;
  type: LeaveTypeKey;
  entitlement: number;
  taken: number;
  remaining: number;
  carryover: number;
  expiryDate: string;
}

export interface LeaveRequest {
  id: string;
  employeeId: string;
  employee: string;
  dept: string;
  position: string;
  employeeType: 'Employee' | 'Intern';
  gender: 'Male' | 'Female';
  type: LeaveTypeKey;
  startDate: string;
  endDate: string;
  days: number;
  reason: string;
  status: LeaveStatus;
  submittedOn: string;
  hodApprovedBy?: string;
  hodApprovedOn?: string;
  hosApprovedBy?: string;
  hosApprovedOn?: string;
  hosComment?: string;
  approvedBy?: string;
  approvedOn?: string;
  rejectionReason?: string;
  rejectedBy?: string;
  rejectedStage?: string;
  hasDocument?: boolean;
  dutyDelegate?: string;
  reviewComment?: string;
  reviewRequested?: boolean;
  reviewNewStart?: string;
  reviewNewEnd?: string;
  reviewBy?: string;
  reviewDate?: string;
}

export interface Employee {
  id: string;
  name: string;
  dept: string;
  position: string;
  employeeType: 'Employee' | 'Intern';
  gender: 'Male' | 'Female';
  avatar: string;
  manager: string;
  email: string;
}

export const DEPARTMENTS = ['All Departments', 'Monitoring & Evaluation', 'Transport', 'Procurement', 'Corporate Communication', 'ICT', 'HR', 'Finance', 'Operations'];

export const EMPLOYEES: Employee[] = [
  { id: 'E001', name: 'Jane Mwangi', dept: 'HR', position: 'HR Officer', employeeType: 'Employee', gender: 'Female', avatar: 'JM', manager: 'Susan Kariuki', email: 'jane.mwangi@uwezo.go.ke' },
  { id: 'E002', name: 'Peter Otieno', dept: 'ICT', position: 'Systems Developer', employeeType: 'Employee', gender: 'Male', avatar: 'PO', manager: 'Gedion Njoroge', email: 'peter.otieno@uwezo.go.ke' },
  { id: 'E003', name: 'Grace Wanjiku', dept: 'Finance', position: 'Accountant', employeeType: 'Employee', gender: 'Female', avatar: 'GW', manager: 'James Omondi', email: 'grace.wanjiku@uwezo.go.ke' },
  { id: 'E004', name: 'Samuel Kipchoge', dept: 'Operations', position: 'Operations Officer', employeeType: 'Employee', gender: 'Male', avatar: 'SK', manager: 'Mary Ndungu', email: 'samuel.kipchoge@uwezo.go.ke' },
  { id: 'E005', name: 'Fatuma Hassan', dept: 'HR', position: 'HR Assistant', employeeType: 'Employee', gender: 'Female', avatar: 'FH', manager: 'Susan Kariuki', email: 'fatuma.hassan@uwezo.go.ke' },
  { id: 'E006', name: 'Alice Odhiambo', dept: 'ICT', position: 'Network Administrator', employeeType: 'Employee', gender: 'Female', avatar: 'AO', manager: 'Gedion Njoroge', email: 'alice.odhiambo@uwezo.go.ke' },
  { id: 'E007', name: 'Brian Kamau', dept: 'Finance', position: 'Finance Officer', employeeType: 'Employee', gender: 'Male', avatar: 'BK', manager: 'James Omondi', email: 'brian.kamau@uwezo.go.ke' },
  { id: 'E008', name: 'Mercy Achieng', dept: 'Operations', position: 'Procurement Officer', employeeType: 'Employee', gender: 'Female', avatar: 'MA', manager: 'Mary Ndungu', email: 'mercy.achieng@uwezo.go.ke' },
  { id: 'E009', name: 'John Muthoni', dept: 'ICT', position: 'IT Support', employeeType: 'Employee', gender: 'Male', avatar: 'JM2', manager: 'Gedion Njoroge', email: 'john.muthoni@uwezo.go.ke' },
  { id: 'E010', name: 'Linda Wambui', dept: 'Finance', position: 'Senior Accountant', employeeType: 'Employee', gender: 'Female', avatar: 'LW', manager: 'James Omondi', email: 'linda.wambui@uwezo.go.ke' },
  { id: 'I001', name: 'Kevin Ochieng', dept: 'ICT', position: 'IT Intern', employeeType: 'Intern', gender: 'Male', avatar: 'KO', manager: 'Gedion Njoroge', email: 'kevin.ochieng@uwezo.go.ke' },
  { id: 'I002', name: 'Amina Yusuf', dept: 'HR', position: 'HR Intern', employeeType: 'Intern', gender: 'Female', avatar: 'AY', manager: 'Susan Kariuki', email: 'amina.yusuf@uwezo.go.ke' },
  { id: 'I003', name: 'Dennis Mwenda', dept: 'Finance', position: 'Finance Intern', employeeType: 'Intern', gender: 'Male', avatar: 'DM', manager: 'James Omondi', email: 'dennis.mwenda@uwezo.go.ke' },
  { id: 'I004', name: 'Cynthia Auma', dept: 'Operations', position: 'Operations Intern', employeeType: 'Intern', gender: 'Female', avatar: 'CA', manager: 'Mary Ndungu', email: 'cynthia.auma@uwezo.go.ke' },
  { id: 'I005', name: 'Felix Njoroge', dept: 'ICT', position: 'Software Intern', employeeType: 'Intern', gender: 'Male', avatar: 'FN', manager: 'Gedion Njoroge', email: 'felix.njoroge@uwezo.go.ke' },
];

export const EMPLOYEE_GENDERS = {
  'E001': 'Female',
  'E002': 'Male',
  'E003': 'Female',
  'E004': 'Male',
  'E005': 'Female',
  'E006': 'Female',
  'E007': 'Male',
  'E008': 'Female',
  'E009': 'Male',
  'E010': 'Female',
  'I001': 'Male',
  'I002': 'Female',
  'I003': 'Male',
  'I004': 'Female',
  'I005': 'Male',
};

export const LEAVE_POLICIES: LeavePolicy[] = [
  { type: 'Annual', label: 'Annual Leave', entitlement: 21, internEntitlement: 15, accrualRate: 1.75, maxCarryover: 30, unpaidAllowed: false, notes: 'Accrues monthly at 1.75 days/month. Max 30 days carryover to next year. Must apply 14 days in advance.', color: '#8b5cf6', icon: 'ri-sun-line' },
  { type: 'Sick', label: 'Sick Leave', entitlement: 30, internEntitlement: 30, accrualRate: 30, maxCarryover: 0, unpaidAllowed: false, notes: '30 days per year. No carryover. Medical certificate required for 3+ consecutive days.', color: '#ef4444', icon: 'ri-heart-pulse-line' },
  { type: 'Maternity', label: 'Maternity Leave', entitlement: 90, internEntitlement: 90, accrualRate: 90, maxCarryover: 0, unpaidAllowed: false, notes: '90 calendar days with full pay. Once per 3 years. Female employees only. Requires birth notification.', color: '#ec4899', icon: 'ri-women-line' },
  { type: 'Paternity', label: 'Paternity Leave', entitlement: 10, internEntitlement: 10, accrualRate: 10, maxCarryover: 0, unpaidAllowed: false, notes: '10 working days per childbirth. Male employees only. Must be taken within 30 days of birth.', color: '#3b82f6', icon: 'ri-men-line' },
  { type: 'Bereavement', label: 'Bereavement Leave', entitlement: 5, internEntitlement: 5, accrualRate: 5, maxCarryover: 0, unpaidAllowed: false, notes: '5 days per bereavement event. Requires death certificate or notification.', color: '#6b7280', icon: 'ri-emotion-sad-line' },
  { type: 'Unpaid', label: 'Unpaid Leave', entitlement: 0, internEntitlement: 0, accrualRate: 0, maxCarryover: 0, unpaidAllowed: true, notes: 'No limit. Requires additional HR and management approval. No pay during period.', color: '#64748b', icon: 'ri-subtract-line' },
];

export const LEAVE_BALANCES: LeaveBalance[] = [
  { employeeId: 'E001', type: 'Annual', entitlement: 21, taken: 9, remaining: 12, carryover: 5, expiryDate: '2027-03-31' },
  { employeeId: 'E001', type: 'Sick', entitlement: 30, taken: 22, remaining: 8, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E001', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E001', type: 'Bereavement', entitlement: 5, taken: 0, remaining: 5, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E001', type: 'Unpaid', entitlement: 0, taken: 0, remaining: 0, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E002', type: 'Annual', entitlement: 21, taken: 5, remaining: 16, carryover: 3, expiryDate: '2027-03-31' },
  { employeeId: 'E002', type: 'Sick', entitlement: 30, taken: 4, remaining: 26, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E002', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E003', type: 'Annual', entitlement: 21, taken: 14, remaining: 7, carryover: 8, expiryDate: '2027-03-31' },
  { employeeId: 'E003', type: 'Sick', entitlement: 30, taken: 2, remaining: 28, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E003', type: 'Maternity', entitlement: 90, taken: 90, remaining: 0, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E004', type: 'Annual', entitlement: 21, taken: 7, remaining: 14, carryover: 2, expiryDate: '2027-03-31' },
  { employeeId: 'E004', type: 'Sick', entitlement: 30, taken: 10, remaining: 20, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E004', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E005', type: 'Annual', entitlement: 21, taken: 3, remaining: 18, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'E005', type: 'Sick', entitlement: 30, taken: 0, remaining: 30, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E005', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E006', type: 'Annual', entitlement: 21, taken: 0, remaining: 21, carryover: 4, expiryDate: '2027-03-31' },
  { employeeId: 'E006', type: 'Sick', entitlement: 30, taken: 5, remaining: 25, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E006', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E007', type: 'Annual', entitlement: 21, taken: 21, remaining: 0, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'E007', type: 'Sick', entitlement: 30, taken: 8, remaining: 22, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E007', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E008', type: 'Annual', entitlement: 21, taken: 6, remaining: 15, carryover: 1, expiryDate: '2027-03-31' },
  { employeeId: 'E008', type: 'Sick', entitlement: 30, taken: 3, remaining: 27, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E008', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E009', type: 'Annual', entitlement: 21, taken: 10, remaining: 11, carryover: 6, expiryDate: '2027-03-31' },
  { employeeId: 'E009', type: 'Sick', entitlement: 30, taken: 15, remaining: 15, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E009', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E010', type: 'Annual', entitlement: 21, taken: 4, remaining: 17, carryover: 10, expiryDate: '2027-03-31' },
  { employeeId: 'E010', type: 'Sick', entitlement: 30, taken: 1, remaining: 29, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'E010', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I001', type: 'Annual', entitlement: 21, taken: 2, remaining: 19, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'I001', type: 'Sick', entitlement: 30, taken: 1, remaining: 29, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I001', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I002', type: 'Annual', entitlement: 21, taken: 0, remaining: 21, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'I002', type: 'Sick', entitlement: 30, taken: 3, remaining: 27, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I002', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I003', type: 'Annual', entitlement: 21, taken: 1, remaining: 20, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'I003', type: 'Sick', entitlement: 30, taken: 0, remaining: 30, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I003', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I004', type: 'Annual', entitlement: 21, taken: 3, remaining: 18, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'I004', type: 'Sick', entitlement: 30, taken: 2, remaining: 28, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I004', type: 'Maternity', entitlement: 90, taken: 0, remaining: 90, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I005', type: 'Annual', entitlement: 21, taken: 0, remaining: 21, carryover: 0, expiryDate: '2027-03-31' },
  { employeeId: 'I005', type: 'Sick', entitlement: 30, taken: 0, remaining: 30, carryover: 0, expiryDate: '2026-12-31' },
  { employeeId: 'I005', type: 'Paternity', entitlement: 10, taken: 0, remaining: 10, carryover: 0, expiryDate: '2026-12-31' },
];

export const INITIAL_LEAVE_REQUESTS: LeaveRequest[] = [
  { id: 'LV001', employeeId: 'E001', employee: 'Jane Mwangi', dept: 'HR', position: 'HR Officer', employeeType: 'Employee', gender: 'Female', type: 'Annual', startDate: '2026-05-01', endDate: '2026-05-04', days: 4, reason: 'Family vacation planned for Easter holiday.', status: 'Pending', submittedOn: '2026-04-10' },
  { id: 'LV002', employeeId: 'E002', employee: 'Peter Otieno', dept: 'ICT', position: 'Systems Developer', employeeType: 'Employee', gender: 'Male', type: 'Sick', startDate: '2026-04-07', endDate: '2026-04-08', days: 2, reason: 'Doctor advised rest due to flu.', status: 'Approved', submittedOn: '2026-04-06', hodApprovedBy: 'David Njoroge (HOD-ICT)', hodApprovedOn: '2026-04-06', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-04-07', approvedBy: 'HR Manager', approvedOn: '2026-04-07', hasDocument: true },
  { id: 'LV003', employeeId: 'E003', employee: 'Grace Wanjiku', dept: 'Finance', position: 'Accountant', employeeType: 'Employee', gender: 'Female', type: 'Maternity', startDate: '2026-04-15', endDate: '2026-07-13', days: 90, reason: 'Maternity leave as per employment terms.', status: 'Approved', submittedOn: '2026-04-01', hodApprovedBy: 'James Omondi (HOD-Finance)', hodApprovedOn: '2026-04-01', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-04-02', approvedBy: 'HR Manager', approvedOn: '2026-04-02' },
  { id: 'LV004', employeeId: 'E004', employee: 'Samuel Kipchoge', dept: 'Operations', position: 'Operations Officer', employeeType: 'Employee', gender: 'Male', type: 'Annual', startDate: '2026-05-06', endDate: '2026-05-10', days: 5, reason: 'Personal travel and rest.', status: 'HOD Approved', submittedOn: '2026-04-08', hodApprovedBy: 'Mary Ndungu (HOD-Operations)', hodApprovedOn: '2026-04-15' },
  { id: 'LV006', employeeId: 'E006', employee: 'Alice Odhiambo', dept: 'ICT', position: 'Network Administrator', employeeType: 'Employee', gender: 'Female', type: 'Annual', startDate: '2026-05-12', endDate: '2026-05-16', days: 5, reason: 'Annual family gathering upcountry.', status: 'Pending', submittedOn: '2026-04-14' },
  { id: 'LV007', employeeId: 'E007', employee: 'Brian Kamau', dept: 'Finance', position: 'Finance Officer', employeeType: 'Employee', gender: 'Male', type: 'Sick', startDate: '2026-03-10', endDate: '2026-03-12', days: 3, reason: 'Stomach ailment, doctor visit required.', status: 'Approved', submittedOn: '2026-03-09', hodApprovedBy: 'James Omondi (HOD-Finance)', hodApprovedOn: '2026-03-09', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-03-10', approvedBy: 'HR Manager', approvedOn: '2026-03-10' },
  { id: 'LV008', employeeId: 'E008', employee: 'Mercy Achieng', dept: 'Operations', position: 'Procurement Officer', employeeType: 'Employee', gender: 'Female', type: 'Bereavement', startDate: '2026-03-20', endDate: '2026-03-24', days: 5, reason: 'Loss of close relative.', status: 'Approved', submittedOn: '2026-03-19', hodApprovedBy: 'Mary Ndungu (HOD-Operations)', hodApprovedOn: '2026-03-19', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-03-19', approvedBy: 'HR Manager', approvedOn: '2026-03-19' },
  { id: 'LV010', employeeId: 'E010', employee: 'Linda Wambui', dept: 'Finance', position: 'Senior Accountant', employeeType: 'Employee', gender: 'Female', type: 'Annual', startDate: '2026-05-19', endDate: '2026-05-23', days: 5, reason: 'Holiday travel.', status: 'Pending', submittedOn: '2026-04-15' },
  { id: 'LV011', employeeId: 'I001', employee: 'Kevin Ochieng', dept: 'ICT', position: 'IT Intern', employeeType: 'Intern', gender: 'Male', type: 'Sick', startDate: '2026-04-09', endDate: '2026-04-09', days: 1, reason: 'Feeling unwell.', status: 'Approved', submittedOn: '2026-04-09', hodApprovedBy: 'David Njoroge (HOD-ICT)', hodApprovedOn: '2026-04-09', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-04-09', approvedBy: 'HR Manager', approvedOn: '2026-04-09' },
  { id: 'LV012', employeeId: 'I002', employee: 'Amina Yusuf', dept: 'HR', position: 'HR Intern', employeeType: 'Intern', gender: 'Female', type: 'Annual', startDate: '2026-05-06', endDate: '2026-05-07', days: 2, reason: 'Personal leave.', status: 'Pending', submittedOn: '2026-04-14' },
  { id: 'LV013', employeeId: 'E001', employee: 'Jane Mwangi', dept: 'HR', position: 'HR Officer', employeeType: 'Employee', gender: 'Female', type: 'Sick', startDate: '2026-02-10', endDate: '2026-02-12', days: 3, reason: 'Flu and fever.', status: 'Approved', submittedOn: '2026-02-10', hodApprovedBy: 'Susan Kariuki (HOD-HR)', hodApprovedOn: '2026-02-10', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-02-10', approvedBy: 'HR Manager', approvedOn: '2026-02-10', hasDocument: true },
  { id: 'LV016', employeeId: 'E004', employee: 'Samuel Kipchoge', dept: 'Operations', position: 'Operations Officer', employeeType: 'Employee', gender: 'Male', type: 'Sick', startDate: '2026-03-05', endDate: '2026-03-07', days: 3, reason: 'Malaria treatment.', status: 'Approved', submittedOn: '2026-03-05', hodApprovedBy: 'Mary Ndungu (HOD-Operations)', hodApprovedOn: '2026-03-05', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-03-05', approvedBy: 'HR Manager', approvedOn: '2026-03-05', hasDocument: true },
  { id: 'LV017', employeeId: 'E004', employee: 'Samuel Kipchoge', dept: 'Operations', position: 'Operations Officer', employeeType: 'Employee', gender: 'Male', type: 'Paternity', startDate: '2026-02-01', endDate: '2026-02-14', days: 10, reason: 'Newborn child care.', status: 'Approved', submittedOn: '2026-01-28', hodApprovedBy: 'Mary Ndungu (HOD-Operations)', hodApprovedOn: '2026-01-28', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-01-29', approvedBy: 'HR Manager', approvedOn: '2026-01-29' },
  { id: 'LV018', employeeId: 'E009', employee: 'John Muthoni', dept: 'ICT', position: 'IT Support', employeeType: 'Employee', gender: 'Male', type: 'Annual', startDate: '2026-03-16', endDate: '2026-03-20', days: 5, reason: 'Rest and recreation.', status: 'Approved', submittedOn: '2026-03-10', hodApprovedBy: 'David Njoroge (HOD-ICT)', hodApprovedOn: '2026-03-10', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-03-11', approvedBy: 'HR Manager', approvedOn: '2026-03-11' },
  { id: 'LV019', employeeId: 'I004', employee: 'Cynthia Auma', dept: 'Operations', position: 'Operations Intern', employeeType: 'Intern', gender: 'Female', type: 'Sick', startDate: '2026-04-11', endDate: '2026-04-11', days: 1, reason: 'Headache and fever.', status: 'Approved', submittedOn: '2026-04-11', hodApprovedBy: 'Mary Ndungu (HOD-Operations)', hodApprovedOn: '2026-04-11', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-04-11', approvedBy: 'HR Manager', approvedOn: '2026-04-11' },
  { id: 'LV020', employeeId: 'E007', employee: 'Brian Kamau', dept: 'Finance', position: 'Finance Officer', employeeType: 'Employee', gender: 'Male', type: 'Annual', startDate: '2026-05-26', endDate: '2026-05-30', days: 5, reason: 'Annual leave.', status: 'HOS Approved', submittedOn: '2026-04-15', hodApprovedBy: 'James Omondi (HOD-Finance)', hodApprovedOn: '2026-04-16', hosApprovedBy: 'Dr. Francis Mwenda (HOS)', hosApprovedOn: '2026-04-18' },
];

export const PUBLIC_HOLIDAYS = [
  { date: '2026-01-01', name: "New Year's Day" },
  { date: '2026-04-03', name: 'Good Friday' },
  { date: '2026-04-06', name: 'Easter Monday' },
  { date: '2026-05-01', name: 'Labour Day' },
  { date: '2026-06-01', name: 'Madaraka Day' },
  { date: '2026-10-10', name: 'Huduma Day' },
  { date: '2026-10-20', name: 'Mashujaa Day' },
  { date: '2026-12-12', name: 'Jamhuri Day' },
  { date: '2026-12-25', name: 'Christmas Day' },
  { date: '2026-12-26', name: 'Boxing Day' },
];

export function calculateDays(from: string, to: string): number {
  if (!from || !to) return 0;
  const start = new Date(from);
  const end = new Date(to);
  if (end < start) return 0;
  const diffTime = end.getTime() - start.getTime();
  return Math.floor(diffTime / (1000 * 60 * 60 * 24)) + 1;
}

export function calculateWorkingDays(from: string, to: string): number {
  const start = new Date(from);
  const end = new Date(to);
  let days = 0;
  const holidayDates = new Set(PUBLIC_HOLIDAYS.map(h => h.date));
  for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
    const dow = d.getDay();
    const dateStr = d.toISOString().split('T')[0];
    if (dow !== 0 && dow !== 6 && !holidayDates.has(dateStr)) days++;
  }
  return days;
}

export function getMinStartDate(type?: LeaveTypeKey): string {
  const d = new Date();
  if (type === 'Sick' || type === 'Bereavement') {
    return d.toISOString().split('T')[0];
  }
  d.setDate(d.getDate() + 14);
  return d.toISOString().split('T')[0];
}

export function getEmployeeBalances(employeeId: string): LeaveBalance[] {
  return LEAVE_BALANCES.filter(b => b.employeeId === employeeId);
}

export function getBalanceForType(employeeId: string, type: LeaveTypeKey): LeaveBalance | null {
  return LEAVE_BALANCES.find(b => b.employeeId === employeeId && b.type === type) || null;
}

export function getLeaveEntitlement(type: LeaveTypeKey, isIntern: boolean = false): number {
  const policy = LEAVE_POLICIES.find(p => p.type === type);
  if (!policy) return 0;
  return isIntern ? policy.internEntitlement : policy.entitlement;
}

export function computeEmployeeBalance(
  employeeId: string,
  type: LeaveTypeKey,
  isIntern: boolean,
  approvedRequests: LeaveRequest[]
): LeaveBalance {
  const policy = LEAVE_POLICIES.find(p => p.type === type);
  const entitlement = getLeaveEntitlement(type, isIntern);
  const taken = approvedRequests
    .filter(r => r.employeeId === employeeId && r.type === type && r.status === 'Approved')
    .reduce((sum, r) => sum + r.days, 0);
  const remaining = entitlement === 0 ? 0 : Math.max(0, entitlement - taken);
  const staticBal = LEAVE_BALANCES.find(b => b.employeeId === employeeId && b.type === type);
  return {
    employeeId,
    type,
    entitlement,
    taken,
    remaining,
    carryover: staticBal?.carryover ?? 0,
    expiryDate: staticBal?.expiryDate ?? '2026-12-31',
  };
}

export function getAllBalancesForEmployee(
  employeeId: string,
  isIntern: boolean,
  gender: 'Male' | 'Female',
  approvedRequests: LeaveRequest[]
): LeaveBalance[] {
  const availableTypes = getAvailableLeaveTypes(gender, isIntern);
  return availableTypes.map(type => computeEmployeeBalance(employeeId, type, isIntern, approvedRequests));
}

export function isCurrentlyOnLeave(employeeId: string, requests: LeaveRequest[]): LeaveRequest | null {
  const today = new Date().toISOString().split('T')[0];
  return requests.find(r => r.employeeId === employeeId && r.status === 'Approved' && r.startDate <= today && r.endDate >= today) || null;
}

export function getUpcomingLeave(employeeId: string, requests: LeaveRequest[]): LeaveRequest | null {
  const today = new Date().toISOString().split('T')[0];
  const upcoming = requests.filter(r => r.employeeId === employeeId && r.status === 'Approved' && r.startDate > today);
  upcoming.sort((a, b) => a.startDate.localeCompare(b.startDate));
  return upcoming[0] || null;
}

export function getAvailableLeaveTypes(gender: 'Male' | 'Female', isIntern?: boolean): LeaveTypeKey[] {
  if (isIntern) {
    const internTypes: LeaveTypeKey[] = ['Annual', 'Sick', 'Bereavement'];
    if (gender === 'Female') internTypes.push('Maternity');
    if (gender === 'Male') internTypes.push('Paternity');
    return internTypes;
  }
  const all: LeaveTypeKey[] = ['Annual', 'Sick', 'Bereavement', 'Unpaid'];
  if (gender === 'Female') all.push('Maternity');
  if (gender === 'Male') all.push('Paternity');
  return all;
}
