import { z } from "zod";

export const purchaseLineInputSchema = z.object({
  grade_id: z.string().trim().optional().nullable().or(z.literal("")),
  qty_ordered: z.coerce.number().positive("Qty harus lebih besar dari 0"),
  qty_received: z.coerce.number().min(0, "Qty diterima tidak boleh negatif").default(0),
  qty_accepted: z.coerce.number().min(0, "Qty diterima valid tidak boleh negatif").default(0),
  qty_rejected: z.coerce.number().min(0, "Qty ditolak tidak boleh negatif").default(0),
  mal_unit_price: z.coerce.number().nonnegative("Harga MAL tidak boleh negatif").nullable().optional(),
  unit_id: z.string().trim().min(1, "Unit wajib dipilih"),
  unit_price: z.coerce.number().nonnegative("Harga beli tidak boleh negatif").default(0),
  unit_cost: z.coerce.number().nonnegative("Unit cost tidak boleh negatif").default(0),
  classification_status: z.enum(["FINAL", "PROVISIONAL"]).default("FINAL"),
  warehouse_id: z.string().trim().optional().or(z.literal("")),
  warehouse_location_id: z.string().trim().optional().nullable(),
  notes: z.string().trim().optional().nullable().or(z.literal(""))
}).superRefine((line, ctx) => {
  if (line.qty_received < line.qty_accepted + line.qty_rejected) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      path: ["qty_accepted"],
      message: "Qty accepted + rejected tidak boleh melebihi qty diterima"
    });
  }
});

const purchaseCostLineInputSchema = z.object({
  cost_name: z.string().trim().min(1, "Nama biaya wajib diisi"),
  amount: z.coerce.number().min(0, "Jumlah biaya tidak boleh negatif"),
  notes: z.string().trim().optional().nullable().or(z.literal("")),
  proof_file_url: z.string().trim().optional().nullable().or(z.literal(""))
});

export const purchaseInputSchema = z.object({
  agent_id: z.string().trim().optional().nullable().or(z.literal("")),
  profit_share_scheme_id: z.string().trim().optional().nullable().or(z.literal("")),
  courier_id: z.string().trim().optional().nullable().or(z.literal("")),
  received_by_employee_id: z.string().trim().min(1, "Penerima wajib dipilih"),
  received_at: z.string().trim().min(1, "Waktu diterima wajib diisi"),
  purchase_date: z.string().trim().min(1, "Tanggal pembelian wajib diisi"),
  supplier_invoice_no: z.string().trim().optional().nullable().or(z.literal("")),
  warehouse_id: z.string().trim().optional().nullable().or(z.literal("")),
  warehouse_location_id: z.string().trim().optional().nullable(),
  modal_beli: z.coerce.number().nonnegative("Modal beli tidak boleh negatif").optional(),
  modal_barang: z.coerce.number().nonnegative("Modal barang tidak boleh negatif").optional(),
  modal_masuk: z.coerce.number().nonnegative("Modal masuk tidak boleh negatif").optional(),
  modal_jual: z.coerce.number().nonnegative("Modal jual tidak boleh negatif").optional(),
  total_modal_beli: z.coerce.number().nonnegative("Total modal beli tidak boleh negatif").optional(),
  total_modal_mal: z.coerce.number().nonnegative("Total modal MAL tidak boleh negatif").optional(),
  average_price: z.coerce.number().nonnegative("Harga rata-rata tidak boleh negatif").optional(),
  berat_beli: z.coerce.number().nonnegative("Berat beli tidak boleh negatif").optional(),
  berat_masuk: z.coerce.number().nonnegative("Berat masuk tidak boleh negatif").optional(),
  moisture_buy_percent: z.coerce.number().min(-100, "Kadar beli minimal -100").max(100, "Kadar beli maksimal 100").nullable().optional(),
  moisture_received_percent: z.coerce.number().min(-100, "Kadar masuk minimal -100").max(100, "Kadar masuk maksimal 100").nullable().optional(),
  moisture_final_percent: z.coerce.number().min(-100, "Kadar akhir minimal -100").max(100, "Kadar akhir maksimal 100").nullable().optional(),
  market_reference_price: z.coerce.number().nonnegative("Harga MK A/R tidak boleh negatif").nullable().optional(),
  above_average_ratio_percent: z.coerce
    .number()
    .min(-100, "Barang atas rata-rata tidak valid")
    .nullable()
    .optional(),
  mk_share_percent: z.coerce.number().min(0, "Persentase MK tidak boleh negatif").max(100, "Persentase MK maksimal 100").nullable().optional(),
  non_mk_share_percent: z.coerce.number().min(0, "Persentase non-MK tidak boleh negatif").max(100, "Persentase non-MK maksimal 100").nullable().optional(),
  notes: z.string().trim().optional().nullable().or(z.literal("")),
  cost_lines: z.array(purchaseCostLineInputSchema).default([]),
  lines: z.array(purchaseLineInputSchema).min(1, "Minimal satu line item")
}).superRefine((purchase, ctx) => {
  if (purchase.agent_id && !purchase.profit_share_scheme_id) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      path: ["profit_share_scheme_id"],
      message: "Skema bagi hasil wajib dipilih jika ada agen"
    });
  }
  if (
    purchase.mk_share_percent !== undefined &&
    purchase.mk_share_percent !== null &&
    purchase.non_mk_share_percent !== null &&
    purchase.non_mk_share_percent !== undefined &&
    Number(purchase.mk_share_percent) + Number(purchase.non_mk_share_percent) > 100
  ) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      path: ["mk_share_percent"],
      message: "Total persentase MK dan non-MK tidak boleh lebih dari 100"
    });
  }
});

export type PurchaseInput = z.infer<typeof purchaseInputSchema>;
