"use client";

import { useEffect, useMemo } from "react";

import InputItem from "@/app/Components/FormItems";
import { handleChange } from "@/app/utils/form";
import { useSiteContext } from "@/app/Context/SiteContext";

import SelectSupplier from "../SelectSupplier";
import SectionValidator from "../SectionValidator";
import SendingOptions from "../SendingOptions";
import { AlertMessage } from "../AlertMessage";
import { PurchaseReturnItems } from "../PurchaseReturnItems";

export default function PurchaseReturnForm({
  form,
  setForm,
  settings,
  allPurchaseOrder,
  allSupplierPayments,
  pathname,
  isEditMode,
}) {
  const { setEditLineData, purchaseRelatedData } = useSiteContext();

  /* ======================================================
     PURCHASES ONLY (NORMALIZED)
  ====================================================== */
  const purchases = useMemo(() => {
    if (!purchaseRelatedData) return [];

    if (Array.isArray(purchaseRelatedData?.purchases)) {
      return purchaseRelatedData.purchases;
    }

    if (Array.isArray(purchaseRelatedData)) {
      return purchaseRelatedData;
    }

    if (typeof purchaseRelatedData === "string") {
      try {
        const parsed = JSON.parse(purchaseRelatedData);
        return Array.isArray(parsed) ? parsed : [];
      } catch {
        return [];
      }
    }

    if (Array.isArray(purchaseRelatedData?.rows)) {
      return purchaseRelatedData.rows;
    }

    if (Array.isArray(purchaseRelatedData?.data)) {
      return purchaseRelatedData.data;
    }

    return [];
  }, [purchaseRelatedData]);

  /* ======================================================
     SELECTED PURCHASE
  ====================================================== */
  const selectedPurchase = useMemo(() => {
    if (!form?.purchase_number) return null;
    return (
      purchases.find((p) => p.purchase_number === form.purchase_number) || null
    );
  }, [purchases, form?.purchase_number]);

  /* ======================================================
     LINE ITEMS
  ====================================================== */
  const lineItems = useMemo(() => {
    if (isEditMode && Array.isArray(form?.updated_line_items)) {
      return form.updated_line_items;
    }

    if (!selectedPurchase) return [];

    return selectedPurchase.line_items || [];
  }, [isEditMode, form?.updated_line_items, selectedPurchase]);

  /* ======================================================
     SYNC EDIT LINE DATA
  ====================================================== */
  useEffect(() => {
    if (isEditMode && Array.isArray(form?.updated_line_items)) {
      setEditLineData(form.updated_line_items);
      return;
    }

    if (!isEditMode) {
      setEditLineData([]);
    }
  }, [isEditMode, form?.updated_line_items, pathname, setEditLineData]);

  /* ======================================================
     DELIVERY NOTES + SERIALIZATION + PAYMENTS
  ====================================================== */
  useEffect(() => {
    if (!form?.purchase_number) return;

    const deliveryRefs = [];
    const serials = [];

    allPurchaseOrder.forEach((item) => {
      const lockedPurchase = String(item.locked).replace(/"/g, "");
      if (lockedPurchase !== form.purchase_number) return;

      deliveryRefs.push(item.deliverynote_number);

      try {
        JSON.parse(item.serializationSerial || "[]").forEach((p) => {
          serials.push({
            inventory_id: p.inventory_id,
            used_serialization: {
              deliverynote_number: "",
              usedSerial: p?.used_serialization?.usedSerial || [],
            },
          });
        });
      } catch { }
    });

    const relatedPayments = (allSupplierPayments || []).filter((pay) => {
      try {
        const purchases = JSON.parse(pay.purchase_id || "[]");
        return purchases.some(
          (p) => p.purchase_number === form.purchase_number
        );
      } catch {
        return false;
      }
    });

    setForm((prev) => ({
      ...prev,
      delivery_note_ref_number: deliveryRefs,
      serialization: serials,
      purchase_info: selectedPurchase ? [selectedPurchase] : [],
      payment_info: relatedPayments,
      purchase_order: selectedPurchase?.purchaseorder_ref_number || [],
    }));
  }, [
    allPurchaseOrder,
    allSupplierPayments,
    form.purchase_number,
    selectedPurchase,
    setForm,
  ]);

  /* ======================================================
     INVALID ITEM NUMBER GUARD
  ====================================================== */
  if (!form?.itemNumber || form?.itemNumber === "-NaN") {
    return (
      <div className="container sm:!my-5 !my-3 grid gap-3">
        <AlertMessage
          type="error"
          message="Item number is not valid. Please configure prefix and padding in Settings."
        />
      </div>
    );
  }

  /* ======================================================
     RENDER
  ====================================================== */
  return (
    <div className="container  grid gap-6">

      {/* ================= PRIMARY INFO ================= */}
      <div className="grid gap-6">

        <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">

          <SectionValidator
            formValidation="supplier_name"
            field={form.supplier_name}
            text="At least one supplier is required."
          />

          <SelectSupplier
            setForm={setForm}
            supplierId={form.supplier_id}
          />

          <InputItem
            type="textspecial"
            typeField="number"
            label="Purchase Return Number"
            name="itemNumber"
            value={(form.supplier_name && form.itemNumber) || "-"}
            disabled
          />

          <InputItem
            type="date"
            label="Date"
            name="purchasereturn_date"
            value={form.purchasereturn_date || ""}
            onChange={(e) => handleChange(e, setForm)}
          />

          <InputItem
            type="select"
            allowClear
            disabled={!form.supplier_name}
            label="Select Purchase"
            name="purchase_number"
            value={form.purchase_number}
            onChange={(e) => handleChange(e, setForm)}
            options={purchases.map((p) => ({
              label: p.purchase_number,
              value: p.purchase_number,
            }))}
          />

        </div>

        <SendingOptions settings={settings} />

      </div>
      <div className="grid gap-6 mt-5">



        {/* ================= RETURNABLE ITEMS ================= */}
        {form.supplier_name && (
          <div className="grid gap-4">
            <PurchaseReturnItems
              lineItems={lineItems}
              form={form}
              setForm={setForm}
              selectedPaidPurchase={selectedPurchase ? [selectedPurchase] : []}
              currency={form?.currency || "AED"}
            />
          </div>
        )}
      </div>

    </div>
  );
}
