import { z } from "zod"

const dateInput = z
  .union([z.string(), z.date(), z.null(), z.undefined()])
  .transform((val) => {
    if (val === null || val === undefined || val === "") return undefined
    if (val instanceof Date) return val
    const d = new Date(val)
    return Number.isNaN(d.getTime()) ? undefined : d
  })

export const employeeDocumentSchema = z.object({
  civilIdExpiry:   dateInput.optional(),
  passportNumber:  z.string().optional(),
  passportExpiry:  dateInput.optional(),
  civilIdFileUrl:  z.string().optional(),
  civilIdFileName: z.string().optional(),
  passportFileUrl:  z.string().optional(),
  passportFileName: z.string().optional(),
  otherFileUrl:    z.string().optional(),
  otherFileName:   z.string().optional(),
})

export const salaryComponentSchema = z.object({
  category: z.string().min(1, "Category is required"),
  amount: z.number().nonnegative(),
})

export const leaveAllowanceSchema = z.object({
  annualDays: z.number().int().nonnegative().default(0),
  sickDays: z.number().int().nonnegative().default(0),
})

export const employeeLeaveAllowanceSchema = z
  .object({
    leaveTypeId: z.string().optional(),
    leaveTypeName: z.string().optional(),
    days: z.number().int().nonnegative().default(0),
  })
  .refine((v) => Boolean(v.leaveTypeId || v.leaveTypeName), {
    message: "Leave type is required",
  })

export const employeeShiftSchema = z.object({
  shiftId: z.string().min(1, "Shift is required"),
  effectiveFrom: dateInput.optional(),
})

export const employeeSchema = z.object({
  id: z.string().optional(),
  fullName: z.string().min(1, "Full name is required"),
  dob: dateInput.optional(),
  joiningDate: dateInput.optional(),
  email: z.string().email().optional().or(z.literal("")),
  phone: z.string().optional(),
  civilId: z.string().optional(),
  nationality: z.string().optional(),
  address: z.string().optional(),
  position: z.string().optional(),
  description: z.string().optional(),
  avatarUrl: z.string().optional(),

  departmentId: z.string().optional(),
  subDepartmentId: z.string().optional(),
  branchId: z.string().optional(),
  reportingManagerId: z.string().optional(),

  zktecoId: z.string().optional(),

  shifts: z.array(employeeShiftSchema).default([]),
  document: employeeDocumentSchema.optional(),
  salaryComponents: z.array(salaryComponentSchema).default([]),
  leaveAllowance: leaveAllowanceSchema.optional(),
  leaveAllowances: z.array(employeeLeaveAllowanceSchema).default([]),

  createUser: z.boolean().optional(),
  userPassword: z
    .string()
    .optional()
    .refine((val) => !val || val.length === 0 || val.length >= 6, {
      message: "Password must be at least 6 characters",
    }),
})

export type EmployeeInput = z.infer<typeof employeeSchema>
export type EmployeeShiftInput = z.infer<typeof employeeShiftSchema>
export type SalaryComponentInput = z.infer<typeof salaryComponentSchema>
export type LeaveAllowanceInput = z.infer<typeof leaveAllowanceSchema>
export type EmployeeLeaveAllowanceInput = z.infer<typeof employeeLeaveAllowanceSchema>
export type EmployeeDocumentInput = z.infer<typeof employeeDocumentSchema>