import { z } from "zod";

export const regularSaleCreateSchema = z
  .object({
    sale_date: z.string().trim().min(1, "Tanggal penjualan wajib diisi"),
    buyer_id: z.string().trim().min(1, "Buyer wajib dipilih"),
    buyer_currency_code: z.string().trim().min(1, "Mata uang buyer wajib dipilih"),
    company_currency_code: z.string().trim().min(1, "Mata uang perusahaan wajib dipilih"),
    exchange_rate: z.coerce.number().nullable().optional(),
    courier_id: z.string().trim().optional().nullable().or(z.literal("")),
    shipping_cost_buyer: z.coerce.number().min(0, "Biaya kirim tidak boleh negatif"),
    notes: z.string().trim().max(2000).optional().nullable(),
    lines: z
      .array(
        z.object({
          lot_id: z.string().trim().min(1, "Lot wajib dipilih"),
          qty_planned: z.coerce.number().positive("Berat jual harus lebih besar dari 0"),
          selling_price_planned: z.coerce.number().min(0, "Harga jual tidak boleh negatif"),
          notes: z.string().trim().max(500).optional().nullable()
        })
      )
      .min(1, "Minimal satu barang harus dipilih")
  })
  .superRefine((payload, ctx) => {
    const buyerCurrency = payload.buyer_currency_code.trim().toUpperCase();
    const sellerCurrency = payload.company_currency_code.trim().toUpperCase();

    if (buyerCurrency !== sellerCurrency && (!payload.exchange_rate || payload.exchange_rate <= 0)) {
      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        path: ["exchange_rate"],
        message: "Rate wajib diisi saat mata uang buyer dan perusahaan berbeda"
      });
    }

    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 regularSaleCloseSchema = z.object({
  close_date: z.string().trim().min(1, "Tanggal penyelesaian wajib diisi"),
  lines: z.array(
    z.object({
      line_id: z.string().trim().min(1, "Line wajib dikirim"),
      qty_actual_sold: z.coerce.number().min(0, "Berat jual aktual tidak boleh negatif"),
      qty_returned: z.coerce.number().min(0, "Berat retur tidak boleh negatif"),
      selling_price_actual: z.coerce.number().min(0, "Harga jual aktual tidak boleh negatif")
    })
  ).min(1, "Seluruh item penjualan harus dikirim saat close")
});

export type RegularSaleCreateInput = z.infer<typeof regularSaleCreateSchema>;
export type RegularSaleCloseInput = z.infer<typeof regularSaleCloseSchema>;
