"use client";

import { Card, Space } from "antd";
import { useEffect, useMemo } from "react";

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

import SelectCustomer from "../SelectCustomer";
import SectionValidator from "../SectionValidator";
import SendingOptions from "../SendingOptions";
import LineItemFormTable from "../LineItemFormTable";
import Summary from "../Summary";
import { AlertMessage } from "../AlertMessage";

export default function SalesOrderForm({
  form,
  setForm,
  settings,
  currency,
  enableGlobalDiscount = false,
  allInventory,
  isEditMode,
  type,
  pathname,
}) {
  const {
    lineItems,
    customerRelatedData,
    editLineData,
    setEditLineData,
    quoteLineItems,
    setQuoteLineItems,
  } = useSiteContext();

  /* ===============================
     HELPERS (DeliveryNote-style)
  ================================ */

  const getSingleQuoteId = (quote_id) =>
    Array.isArray(quote_id) ? quote_id[0] : quote_id;

  const selectedQuoteId = getSingleQuoteId(form.quote_id);

  /* ===============================
     EDIT MODE LINE ITEMS
  ================================ */

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

  /* ===============================
     VALID ITEM NUMBER
  ================================ */

  if (!form?.itemNumber || form?.itemNumber === "-NaN") {
    return (
      <div className="container sm:!my-5 !my-3 grid sm:gap-5 gap-3">
        <AlertMessage
          type="error"
          message="Item number is not valid. Please go to Settings to set up the prefix and padding."
        />
      </div>
    );
  }

  /* ===============================
     NORMALIZE STATUS
  ================================ */

  const normalizedStatus = useMemo(
    () => parseArrayField(form?.status),
    [form?.status],
  );

  /* ===============================
     DEFAULT STATUS (ADD MODE)
  ================================ */

  useEffect(() => {
    if (isEditMode || normalizedStatus.length) return;

    const defaultStatus = getStatusById(12);
    if (!defaultStatus) return;

    setForm((prev) => ({
      ...prev,
      status: [
        {
          id: defaultStatus.id,
          key: defaultStatus.key,
          label: defaultStatus.label,
        },
      ],
    }));
  }, [isEditMode, normalizedStatus, setForm]);

  /* ===============================
     FILTER APPROVED QUOTES
  ================================ */

  const filteredQuotes = customerRelatedData?.[0]?.quotes?.filter((quote) => {
    const statusId = parseArrayField(quote?.status)?.[0]?.id;
    return (
      statusId === getStatusById(1)?.id || statusId === getStatusById(18)?.id
    );

  });


  useEffect(() => {
    if (!form.quote_id) return;

    const reduceLineItemsByUpdated = (lineItems = [], updatedItems = []) => {
      const purchasedMap = updatedItems.reduce((acc, item) => {
        acc[item.item_id] = (acc[item.item_id] || 0) + Number(item.qty || 0);
        return acc;
      }, {});

      return lineItems
        .map((item) => {
          const purchasedQty = purchasedMap[item.item_id] || 0;
          const remainingQty = Number(item.qty || 0) - purchasedQty;

          if (remainingQty <= 0) return null;

          return {
            ...item,
            qty: remainingQty,
            total: (remainingQty * Number(item.price || 0)).toFixed(2),
          };
        })
        .filter(Boolean);
    };

    const fetchQuotes = async () => {
      try {
        const quoteNumbers = Array.isArray(form.quote_id)
          ? form.quote_id.join(",")
          : form.quote_id;

        if (!quoteNumbers) return;

        const res = await fetch(
          `/api/quote?quote_number=${encodeURIComponent(quoteNumbers)}`,
          { credentials: "same-origin" },
        );

        if (!res.ok) return;

        const data = await res.json();
        if (!data?.success) return;

        const quotes = Array.isArray(data.quote) ? data.quote : [data.quote];

        // Fetch all line items and updated line items without merging them
        const allLineItems = quotes.flatMap((q) => q?.line_items || []);
        const allUpdatedLineItems = quotes.flatMap(
          (q) => q?.updated_line_items || [],
        );

        // Don't merge items, just keep them separate
        const remainingLineItems = reduceLineItemsByUpdated(
          allLineItems,
          allUpdatedLineItems,
        );

        setQuoteLineItems(remainingLineItems);

        const lpoNumber = quotes[0]?.lpo_number ?? "";
        setForm((prev) => ({
          ...prev,
          lpo_number: lpoNumber ? Number(lpoNumber) || lpoNumber : "",
        }));
      } catch (err) {
        console.error("Fetch quote failed:", err);
      }
    };

    fetchQuotes();
  }, [form.quote_id, setForm, setQuoteLineItems]);



  /* ===============================
     RENDER
  ================================ */

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

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

        <div className="grid grid-cols-1 lg:grid-cols-3 gap-6 w-full">
          <SectionValidator
            formValidation="customer_name"
            field={form.customer_name}
            text="At least one customer is required."
          />

          <SelectCustomer
            name="customer_name"
            value={form.customer_name}
            onChange={(e) => handleChange(e, setForm)}
            setForm={setForm}
            form={form}
            customerId={form?.customer_id}
          />

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

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

          <InputItem
            type="tag_ant"
            label="Select Quote"
            name="quote_id"
            value={form.quote_id}
            onChange={(e) => handleChange(e, setForm)}
            options={
              filteredQuotes?.map((q) => ({
                label: q.quote_number,
                value: q.quote_number,
              })) || []
            }
            disabled={!form.customer_name}
          />

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

        <div className="grid grid-cols-1 lg:grid-cols-2 gap-6 w-full">
          <InputItem
            type="editor"
            label="Terms and Conditions"
            name="general_terms_conditions"
            value={form.general_terms_conditions || settings?.terms_conditions}
            onChange={(e) => handleChange(e, setForm)}
          />

          <InputItem
            type="editor"
            label="Internal Notes"
            name="notes"
            value={form.notes}
            onChange={(e) => handleChange(e, setForm)}
          />
        </div>

        <div className="flex no-width gap-3 flex-wrap">
          <InputItem
            type="checkbox"
            label="Add eSignature"
            name="digital_signature"
            value={form.digital_signature}
            onChange={(e) => handleChange(e, setForm)}
            className="no-width"
          />

          <InputItem
            type="checkbox"
            label="Add Attachments?"
            name="attachments"
            value={form.attachments}
            onChange={(e) => handleChange(e, setForm)}
            className="no-width"
          />

          <SendingOptions settings={settings} />
        </div>

      </div>

      {/* ================= LINE ITEMS ================= */}
      {selectedQuoteId && (
        <div className="grid gap-4">

          {parseArrayField(form?.line_items).length === 0 && (
            <SectionValidator
              item="line_items"
              text="At least one line item is required."
            />
          )}

          <LineItemFormTable
            tax={false}
            activelineItems={
              isEditMode
                ? quoteLineItems.length
                  ? quoteLineItems
                  : parseArrayField(editLineData)
                : quoteLineItems.length
                  ? quoteLineItems
                  : allInventory
            }
            refdata={quoteLineItems.length !== 0}
            editable={false}
            customercurrency={form.currency}
            form={form}
            setForm={setForm}
            type={type}
          />

        </div>
      )}

      {/* ================= SUMMARY ================= */}
      {lineItems?.length !== 0 && (
        <Summary
          type="salesorder"
          form={form}
          setForm={setForm}
          currency={currency}
          enableGlobalDiscount={enableGlobalDiscount}
        />
      )}

    </div>
  );

}
