import { z } from "zod";

const dateOrNull = z
  .string()
  .datetime({ offset: true })
  .or(z.string().date())
  .or(z.null())
  .optional()
  .transform((v) => (v ? new Date(v) : null));

export const companyFieldsSchema = z.object({
  name: z.string().min(2, "اسم الشركة مطلوب"),
  crNo: z.string().optional().nullable(),
  unifiedNo: z.string().optional().nullable(),
  crExpiry: dateOrNull,
  businessActivity: z.string().optional().nullable(),
  city: z.string().optional().nullable(),
  address: z.string().optional().nullable(),
  phone: z.string().optional().nullable(),
  email: z.string().email().optional().nullable().or(z.literal("")).nullable(),
  isActive: z.boolean().optional().default(true),
  notes: z.string().optional().nullable(),
});

const employeeInputSchema = z.object({
  fullName: z.string().min(2, "اسم الموظف مطلوب"),
  nationality: z.string().optional().nullable(),
  passportNo: z.string().optional().nullable(),
  passportExpiry: dateOrNull,
  iqamaNo: z.string().optional().nullable(),
  iqamaExpiry: dateOrNull,
  iqamaIssueDate: dateOrNull,
  insuranceNo: z.string().optional().nullable(),
  insuranceExpiry: dateOrNull,
  profession: z.string().optional().nullable(),
  department: z.string().optional().nullable(),
  city: z.string().optional().nullable(),
  basicSalary: z.number().positive().optional().nullable(),
  status: z.enum(["active", "resigned", "on_leave"]).optional().default("active"),
  email: z.string().email().optional().nullable().or(z.literal("")).nullable(),
  phone: z.string().optional().nullable(),
  hireDate: dateOrNull,
  notes: z.string().optional().nullable(),
});

const documentInputSchema = z.object({
  employeeId: z.number().int().positive().optional().nullable(), // موظف موجود مسبقاً
  employeeRef: z.number().int().optional().nullable(), // فهرس الموظف المضاف في نفس الطلب
  documentTypeId: z.number().int().positive("نوع المستند مطلوب"),
  title: z.string().min(2, "عنوان المستند مطلوب"),
  referenceNo: z.string().optional().nullable(),
  issuingAuthority: z.string().optional().nullable(),
  issueDate: dateOrNull,
  expiryDate: z
    .union([z.string().datetime({ offset: true }), z.string().date()])
    .refine((v) => !!v, "تاريخ الانتهاء مطلوب")
    .transform((v) => new Date(v)),
  notes: z.string().optional().nullable(),
});

export const createCompanySchema = z.object({
  body: companyFieldsSchema.extend({
    employees: z.array(employeeInputSchema).optional(),
    documents: z.array(documentInputSchema).optional(),
  }),
});

export const updateCompanySchema = z.object({
  body: companyFieldsSchema.partial(),
});

export const createEmployeeSchema = z.object({
  body: employeeInputSchema.extend({
    companyId: z.number().int().positive("الشركة مطلوبة"),
  }),
});

export const updateEmployeeSchema = z.object({
  body: employeeInputSchema.partial(),
});

export const createDocumentSchema = z.object({
  body: z.object({
    companyId: z.number().int().positive("الشركة مطلوبة"),
    employeeId: z.number().int().positive().optional().nullable(),
    documentTypeId: z.number().int().positive("نوع المستند مطلوب"),
    title: z.string().min(2, "عنوان المستند مطلوب"),
    referenceNo: z.string().optional().nullable(),
    issuingAuthority: z.string().optional().nullable(),
    issueDate: dateOrNull,
    expiryDate: z
      .union([z.string().datetime({ offset: true }), z.string().date()])
      .refine((v) => !!v, "تاريخ الانتهاء مطلوب")
      .transform((v) => new Date(v)),
    notes: z.string().optional().nullable(),
  }),
});

export const updateDocumentSchema = z.object({
  body: createDocumentSchema.shape.body.partial(),
});