"use client";

import { Space } from "antd";
import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";

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

import LineItemFormTable from "../LineItemFormTable";
import SelectSupplier from "../SelectSupplier";
import Summary from "../Summary";

export default function PurchaseForm({
  form,
  setForm,
  allSuppliers,
  brandSettings,
  allProformas,
  allPayments,
  enableGlobalDiscount,
  allPurchasesOrder,
  onReferenceChange,
  type,
}) {
  const {
    lineItems,
    selectedSupplier,
    activeCurrency,
    setSelectedSupplierCurrency,
    setEditLineData,
    quoteLineItems,
    newTax,
  } = useSiteContext();

  const router = useRouter();
  const [activeLineItems, setActiveLineItems] = useState([]);

  /* ======================
     SUPPLIER
  ====================== */
  const supplier = allSuppliers?.find(
    (s) => s.supplier_id === selectedSupplier?.id,
  );

  useEffect(() => {
    if (supplier?.currency) {
      setSelectedSupplierCurrency(supplier.currency);
    }
  }, [supplier?.currency]);

  /* ======================
     TAX RAW VALUE
  ====================== */
  const [rawTax, setRawTax] = useState(0);

  useEffect(() => {
    if (!form.add_tax) {
      setRawTax(0);
      return;
    }

    const value =
      Number(getTaxById(newTax, brandSettings?.global_tax)?.value) || 0;

    setRawTax(value);
  }, [form.add_tax, newTax, brandSettings?.global_tax]);

  const taxRate = rawTax > 1 ? rawTax / 100 : rawTax;

  /* ======================
     TOTAL CALCULATION
  ====================== */
  const sumTotal = Array.isArray(lineItems)
    ? lineItems.reduce((acc, item) => {
        const qty = Number(item.qty || 0);
        const price = Number(item.price || 0);

        const subtotal = qty * price;
        const tax = form.add_tax ? subtotal * taxRate : 0;

        return acc + subtotal + tax;
      }, 0)
    : 0;

  useEffect(() => {
    if (parseArrayField(form.line_items).length !== 0) {
      setEditLineData(parseArrayField(form.line_items));
    }

    setForm((prev) => ({
      ...prev,
      total_value: Number(sumTotal.toFixed(2)),
    }));
  }, [sumTotal]);

  /* ======================
     FILTER PURCHASE ORDERS
  ====================== */
  const filteredPurchaseOrders = (allPurchasesOrder || []).filter((order) => {
    const sameSupplier =
      String(order?.supplier_id ?? "") ===
      String(selectedSupplier?.supplier_id ?? "");

    const statuses = parseArrayField(order?.status) || [];

    return (
      sameSupplier &&
      statuses.some((s) => (s.id === 2 || s.id === 3) && s.id !== 5)
    );
  });

  /* ======================
     PURCHASE ORDER LINE ITEMS
  ====================== */
  function getPurchaseOrderLineItems(form, allPurchasesOrder, quoteLineItems) {
    const normalize = (v) => (Array.isArray(v) ? v : [v]).filter(Boolean);

    const selectedPOs = allPurchasesOrder?.filter((po) =>
      normalize(form?.purchaseorder_ref_number).includes(
        po.purchaseorder_number,
      ),
    );

    if (!selectedPOs?.length) return quoteLineItems;

    let items = selectedPOs.flatMap((po) => po.line_items || []);
    const orderStock = selectedPOs[0]?.order_stock || [];

    if (orderStock.length) {
      items = items.map((item) => {
        const stock = orderStock.find((s) => s.item_id === item.item_id);

        const remainingQty = stock
          ? Math.max(Number(item.qty) - Number(stock.purchased_qty), 0)
          : Number(item.qty);

        return {
          ...item,
          qty: remainingQty,
          price: Number(item.price || 0),
        };
      });
    }

    return items.filter((i) => Number(i.qty) > 0);
  }

  useEffect(() => {
    const result = getPurchaseOrderLineItems(
      form,
      allPurchasesOrder,
      quoteLineItems,
    );

    setActiveLineItems(result);
  }, [form?.purchaseorder_ref_number, allPurchasesOrder, quoteLineItems]);

  /* ======================
     PO REF CHANGE
  ====================== */
  const handlePurchaseOrderRefChange = (eventOrValue) => {
    const raw = eventOrValue?.target?.value || eventOrValue;
    const values = Array.isArray(raw) ? raw : [raw];

    if (onReferenceChange) {
      onReferenceChange("purchaseorder", values);
    } else {
      setForm((prev) => ({
        ...prev,
        purchaseorder_ref_number: values,
      }));
    }
  };

  /* ======================
     RENDER
  ====================== */
  return (
    <div className="container !my-5 grid sm:gap-6 gap-4">

      {/* ===== PURCHASE DETAILS ===== */}
      <div className="grid gap-6">

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

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

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

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

          <InputItem
            type="select"
            label="Select Purchase Order"
            name="purchaseorder_ref_number"
            value={form.purchaseorder_ref_number}
            onChange={handlePurchaseOrderRefChange}
            options={mapToLabelValue(
              filteredPurchaseOrders,
              "purchaseorder_number",
              "purchaseorder_number",
            )}
            disabled={!form.supplier_name}
          />

          <InputItem
            type="textspecial"
            label="Invoice Number"
            name="invoice_number"
            value={form.invoice_number}
            onChange={(e) => handleChange(e, setForm)}
          />

        </div>

        <InputItem
          type="editor"
          label="Payment Terms"
          name="payment_terms"
          value={form.payment_terms}
          onChange={(e) => handleChange(e, setForm)}
        />

      </div>

      {/* ===== LINE ITEMS ===== */}
      {form.purchaseorder_ref_number !== "" && (
        <div className="mt-4">

          <div className="mb-4">
            <InputItem
              type="checkbox"
              label="Include Tax"
              name="add_tax"
              value={form.add_tax}
              onChange={(e) => handleChange(e, setForm)}
            />
          </div>

          <LineItemFormTable
            seletedcurrency={activeCurrency}
            tax={!!form.add_tax}
            activelineItems={activeLineItems || lineItems}
            customercurrency={form.currency}
            priceMethod="buying"
            disabled
            editQty
            form={form}
            setForm={setForm}
            type={type}
          />
        </div>
      )}

      {/* ===== SUMMARY ===== */}
      {lineItems?.length !== 0 && (
        <div className="flex justify-end w-full mt-6">
          <div className="lg:w-[50%] w-full">
            <Summary
              type="purchase"
              form={form}
              setForm={setForm}
              currency={activeCurrency}
              enableGlobalDiscount={enableGlobalDiscount}
              brandSettings={brandSettings}
              proformas={allProformas}
              allPayments={allPayments}
              tax={!!form.add_tax}
            />
          </div>
        </div>
      )}

    </div>
  );
}
