import {
  DayPeriod,
  Employee,
  Holiday,
  LeaveAllocation,
  LeaveRequest,
  LeaveRequestStatus,
  LeaveType,
} from '@prisma/client';

type EmpPick = Pick<Employee, 'id' | 'name' | 'code' | 'avatarColor'>;

export function serializeLeaveType(t: LeaveType) {
  return {
    id: t.id,
    code: t.code,
    label: t.label,
    tracksBalance: t.tracksBalance,
  };
}

export function serializeAllocation(a: LeaveAllocation) {
  return {
    id: a.id,
    employeeId: a.employeeId,
    typeId: a.typeId,
    year: a.year,
    allocated: Number(a.allocated),
    validUntil: a.validUntil ? a.validUntil.toISOString().slice(0, 10) : null,
  };
}

export function serializeHoliday(h: Holiday) {
  return {
    id: h.id,
    date: h.date.toISOString().slice(0, 10),
    name: h.name,
  };
}

export function serializeLeaveRequest(
  r: LeaveRequest & {
    employee?: EmpPick | null;
    leaveType?: LeaveType | null;
    decidedBy?: EmpPick | null;
  }
) {
  return {
    id: r.id,
    employeeId: r.employeeId,
    employee: r.employee
      ? {
          id: r.employee.id,
          name: r.employee.name,
          code: r.employee.code,
          avatarColor: r.employee.avatarColor,
        }
      : null,
    typeId: r.typeId,
    leaveType: r.leaveType ? serializeLeaveType(r.leaveType) : null,
    fromDate: r.fromDate.toISOString().slice(0, 10),
    toDate: r.toDate.toISOString().slice(0, 10),
    dayPeriod: r.dayPeriod as DayPeriod,
    days: Number(r.days),
    description: r.description,
    status: r.status as LeaveRequestStatus,
    decidedById: r.decidedById,
    decidedBy: r.decidedBy
      ? {
          id: r.decidedBy.id,
          name: r.decidedBy.name,
          code: r.decidedBy.code,
          avatarColor: r.decidedBy.avatarColor,
        }
      : null,
    decidedAt: r.decidedAt ? r.decidedAt.toISOString() : null,
    decisionNote: r.decisionNote || '',
    createdAt: r.createdAt.toISOString(),
    updatedAt: r.updatedAt.toISOString(),
  };
}
