import { z } from "zod";

export const consignmentCreateSchema = z.object({
  sales_id: z.string().trim().min(1, "Sales wajib dipilih"),
  buyer_id: z.string().trim().min(1, "Buyer wajib dipilih"),
  consignment_date: z.string().trim().min(1, "Tanggal titip wajib diisi"),
  notes: z.string().trim().max(2000).optional().nullable(),
  lines: z
    .array(
      z.object({
        lot_id: z.string().trim().min(1, "Lot wajib dipilih"),
        qty_consigned: z.coerce.number().positive("Berat titip harus lebih besar dari 0"),
        notes: z.string().trim().max(500).optional().nullable()
      })
    )
    .min(1, "Minimal satu barang dititip")
}).superRefine((payload, ctx) => {
  const uniqueLotIds = new Set<string>();
  payload.lines.forEach((line, index) => {
    if (uniqueLotIds.has(line.lot_id)) {
      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        path: ["lines", index, "lot_id"],
        message: "Lot tidak boleh dipilih lebih dari sekali"
      });
      return;
    }
    uniqueLotIds.add(line.lot_id);
  });
});

export const consignmentCloseLineSchema = z.object({
  close_date: z.string().trim().min(1, "Tanggal close wajib diisi"),
  selling_price: z.coerce.number().min(0, "Harga jual tidak boleh negatif"),
  qty_sold: z.coerce.number().min(0, "Berat terjual tidak boleh negatif"),
  qty_returned: z.coerce.number().min(0, "Berat kembali tidak boleh negatif"),
  sales_commission: z.coerce.number().min(0, "Komisi sales tidak boleh negatif")
}).superRefine((payload, ctx) => {
  if (payload.qty_sold === 0 && payload.qty_returned === 0) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      path: ["qty_sold"],
      message: "Isi berat terjual atau berat kembali untuk menutup item"
    });
  }
});
