"use client";

import { useEffect, useState, Suspense } from "react";
import { useSearchParams } from "next/navigation";
import FloatingFooter from "@/components/FloatingFooter";
import { FormSectionHeading } from "@/components/ui/FormSectionHeading";
import { getTodayDate, formatDateToString } from "@/lib/date-utils";
import { parseNumber, formatCurrency } from "@/lib/number-utils";
import { useToast } from "@/hooks/useToast";
import { useFormState } from "@/hooks/useFormState";
import { useFormDataLoader, toOption, safeString, safeDate } from "@/hooks/useFormDataLoader";
import { useFormSubmission } from "@/hooks/useFormSubmission";
import { validatePositiveNumber, validateRequired, validateSelectOption, validateDate } from "@/lib/form-validation";
import { ToastComponent } from "@/components/common/Toast";
import { LoadingOverlay } from "@/components/common/LoadingOverlay";
import BankModal from "@/components/common/BankModel";
import PlacementDatePicker from "@/fields/PlacementDate";
import TransactionTypeSelect from "@/fields/TypeOfTransaction";
import ExecutionTypeSelect from "@/fields/ExecutionType";
import BankAdviceRefNoInput from "@/fields/BankAdviceNo";
import QuantityInput from "@/fields/Quantity";
import SecurityTickerInput from "@/fields/SecurityTicker";
import SecurityNameInput from "@/fields/SecurityName";
import BankNotesInput from "@/fields/BankNotes";
import PricePerSecurityInput from "@/fields/PricePerSecurity";
import EffectiveDatePicker from "@/fields/EffectiveDate";
import MaturityDatePicker from "@/fields/MaturityDate";
import AmountDisplay from "@/fields/Amount";
import CommissionInput from "@/fields/Comission";
import ChargesAndFeesInput from "@/fields/ChargesFeesAbroad";
import FederalTurnoverTaxInput from "@/fields/FederalTurnOver";
import CurrencySelect from "@/fields/Currency";
import AssetTypeOtherInput from "@/fields/AssetTypeOther";
import BankSelect from "@/fields/Bank";
import RemarksInput from "@/fields/Remarks";
import PurposeInput from "@/fields/Purpose";
import MarketPriceInput from "@/fields/MarketPrice";
import RelationshipManagerInput from "@/fields/RelationshipManager";

type FormField =
  | "placementdate"
  | "t_o_t"
  | "e_t"
  | "quantity"
  | "ticker"
  | "securityname"
  | "pricepersecurity"
  | "marketprice";

function OtherAssetsFormContent() {
  const searchParams = useSearchParams();
  const editId = searchParams.get("id");
  const isEditing = Boolean(editId);
  const pageTitle = isEditing ? "Update Other Asset" : "Create New Other Asset";
  const saveLabel = isEditing ? "Update" : "Save";

  const [t_o_t, sett_o_t] = useState<{ label: string; value: string } | null>(null);
  const [e_t, sete_t] = useState<{ label: string; value: string } | null>(null);
  const [p_currency, setp_currency] = useState<{ label: string; value: string } | null>(null);
  const [aassettype, setaassettype] = useState("");
  const [bank, setbank] = useState<{ label: string; value: string } | null>(null);
  const [bankadviserefno, setbankadviserefno] = useState("");
  const [placementdate, setplacementdate] = useState("");
  const [quantity, setquantity] = useState("");
  const [ticker, setticker] = useState("");
  const [securityname, setsecurityname] = useState("");
  const [pricepersecurity, setpricepersecurity] = useState("");
  const [effectivedate, seteffectivedate] = useState("");
  const [maturitydate, setmaturitydate] = useState("");
  const [amount, setamount] = useState("");
  const [commission, setcommission] = useState("");
  const [chargesandfees, setchargesandfees] = useState("");
  const [federalturnovertax, setfederalturnovertax] = useState("");
  const [targetprice, settargetprice] = useState("");
  const [relationshipmanager, setrelationshipmanager] = useState("");
  const [description, setDescription] = useState("");
  const [banknotes, setbanknotes] = useState("");
  const [remarks, setRemarks] = useState("");
  const [showBankModal, setShowBankModal] = useState(false);

  // Common hooks
  const { toast, showToast } = useToast();
  const { errors, setErrors, clearError, handleFieldBlur, formRef } = useFormState<FormField>();
  const { isSaving, submitForm } = useFormSubmission();

  // Load existing data for edit mode
  const { loadingExisting } = useFormDataLoader({
    editId,
    apiEndpoint: "/api/hedgefund",
    transformData: (attributes) => {
      setplacementdate(safeDate(attributes.t_date));
      sett_o_t(toOption(attributes.t_o_t as string | number | null | undefined, attributes.t_o_t_label as string | number | null | undefined));
      sete_t(toOption(attributes.e_t as string | number | null | undefined, attributes.e_t_label as string | number | null | undefined));
      setbank(toOption(attributes.bank_id as string | number | null | undefined, attributes.bank_name as string | number | null | undefined));
      setp_currency(toOption(attributes.p_currency as string | number | null | undefined, attributes.p_currency_label as string | number | null | undefined));
      setaassettype(safeString(attributes.asset_type_t));
      setquantity(safeString(attributes.quantity));
      setticker(safeString(attributes.ticker));
      setsecurityname(safeString(attributes.isin));
      setpricepersecurity(safeString(attributes.price));
      setbanknotes(safeString(attributes.b_notes));
      seteffectivedate(safeDate(attributes.p_date, ""));
      setmaturitydate(safeDate(attributes.m_date, ""));
      setamount(
        attributes.amount !== undefined && attributes.amount !== null
          ? String(attributes.amount).replace(/,/g, "")
          : ""
      );
      setcommission(safeString(attributes.commission));
      setchargesandfees(safeString(attributes.b_1));
      setfederalturnovertax(safeString(attributes.b_2));
      settargetprice(safeString(attributes.t_price));
      setrelationshipmanager(safeString(attributes.r_m));
      setRemarks(safeString(attributes.remarks));
      setDescription(safeString(attributes.purpose));
      setbankadviserefno(safeString(attributes.r_no));
    },
    onError: () => {
      showToast("error", "Unable to load other asset details for editing.");
    },
  });

  useEffect(() => {
    setplacementdate(getTodayDate());
  }, []);

  const hasQuantity = quantity.trim() !== "";
  const hasPrice = pricepersecurity.trim() !== "";
  const hasAmountInput = amount.trim() !== "";

  const quantityNumber = parseNumber(quantity);
  const priceNumber = parseNumber(pricepersecurity);
  const amountNumber = hasAmountInput ? parseNumber(amount) : 0;

  const computedAmount = hasQuantity && hasPrice ? quantityNumber * priceNumber : 0;
  const totalAmount = hasAmountInput ? amountNumber : computedAmount;

  const commissionValue = parseNumber(commission);
  const chargesValue = parseNumber(chargesandfees);
  const taxValue = parseNumber(federalturnovertax);
  const netAmount = totalAmount - commissionValue - chargesValue - taxValue;
  const amountDisplayValue =
    hasAmountInput ? amount : hasQuantity && hasPrice ? computedAmount.toFixed(2) : "";

  const footerData = [
    { label: "Total Amount", value: formatCurrency(totalAmount) },
    { label: "Commission", value: formatCurrency(commissionValue) },
    { label: "Charges", value: formatCurrency(chargesValue) },
    { label: "Tax", value: formatCurrency(taxValue) },
    { label: "Net Amount", value: formatCurrency(netAmount) },
  ];

  const resetForm = () => {
    setplacementdate(getTodayDate());
    sett_o_t(null);
    sete_t(null);
    setp_currency(null);
    setaassettype("");
    setbank(null);
    setbankadviserefno("");
    setquantity("");
    setticker("");
    setsecurityname("");
    setpricepersecurity("");
    seteffectivedate("");
    setmaturitydate("");
    setamount("");
    setcommission("");
    setchargesandfees("");
    setfederalturnovertax("");
    settargetprice("");
    setrelationshipmanager("");
    setDescription("");
    setbanknotes("");
    setRemarks("");
    setErrors({});
  };

  const validateField = (field: FormField): string | undefined => {
    switch (field) {
      case "placementdate":
        return validateDate(placementdate, "Placement date");
      case "t_o_t":
        return validateSelectOption(t_o_t, "Type of transaction");
      case "e_t":
        return validateSelectOption(e_t, "Execution type");
      case "quantity":
        return validatePositiveNumber(quantity, "Quantity");
      case "ticker":
        return validateRequired(ticker, "Security ticker/ISIN");
      case "securityname":
        return validateRequired(securityname, "Security name");
      case "pricepersecurity":
        return validatePositiveNumber(pricepersecurity, "Price per security");
      case "marketprice":
        return validatePositiveNumber(targetprice, "Market price");
      default:
        return undefined;
    }
  };

  const validateForm = () => {
    const fieldsToValidate: FormField[] = [
      "placementdate",
      "t_o_t",
      "e_t",
      "quantity",
      "ticker",
      "securityname",
      "pricepersecurity",
      "marketprice",
    ];
    const newErrors: Record<string, string> = {};
    fieldsToValidate.forEach((field) => {
      const message = validateField(field);
      if (message) {
        newErrors[field] = message;
      }
    });
    return newErrors;
  };

  // Format date from YYYY-MM-DD to DD-MM-YYYY for API
  const formatDateForAPI = (dateStr: string) => {
    if (!dateStr) return "";
    const [year, month, day] = dateStr.split("-");
    return day && month && year ? `${day}-${month}-${year}` : dateStr;
  };

  const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();

    const validationErrors = validateForm();
    if (Object.keys(validationErrors).length > 0) {
      setErrors(validationErrors);
      return;
    }

    setErrors({});

    await submitForm({
      createEndpoint: "/api/hedgefund/create",
      updateEndpoint: "/api/hedgefund/update",
      getPayload: () => ({
        HedgeFunds: {
          t_date: formatDateForAPI(placementdate),
          t_o_t: t_o_t?.value ?? "",
          t_o_t_other: "",
          e_t: e_t?.value ?? "",
          r_no: bankadviserefno,
          quantity: parseNumber(quantity),
          ticker,
          isin: securityname,
          b_notes: banknotes,
          price: parseNumber(pricepersecurity),
          p_date: formatDateForAPI(effectivedate),
          m_date: formatDateForAPI(maturitydate),
          amount,
          commission,
          b_1: chargesandfees,
          b_2: federalturnovertax,
          p_currency: p_currency?.value ?? "",
          a_class: 1430,
          a_type: 1497,
          bank_id: bank?.value ?? "",
          asset_type_t: aassettype,
          market_price_t: pricepersecurity,
          remarks,
          t_price: pricepersecurity,
          purpose: description,
          r_link: "",
          r_m: relationshipmanager,
        },
      }),
      isEditing,
      editId,
      onSuccess: (message) => {
        showToast("success", message);
        if (!isEditing) {
          resetForm();
        }
      },
      onError: (message) => {
        showToast("error", message);
      },
      createSuccessMessage: "Asset saved successfully!",
      updateSuccessMessage: "Asset updated successfully!",
    });
  };

  const handleSave = () => {
    if (!isSaving && !loadingExisting) {
      formRef.current?.requestSubmit();
    }
  };

  return (
    <>
      <ToastComponent toast={toast} />
      <LoadingOverlay isLoading={loadingExisting} message="Loading other asset data..." />
      <div className="container mx-auto mt-6">
        <div className="bg-white rounded-lg shadow-md border-0">
          <FormSectionHeading
            title={pageTitle}
            eyebrow="Key Details"
            showBackButton
            icon={<i className="bx bx-line-chart" aria-hidden="true" />}
            breadcrumbs={[
              { label: "Home", href: "/" },
              { label: "Other Assets", href: "/alternativeinvest/otherassets" },
              { label: pageTitle },
            ]}
          />

          <div className="p-6 md:p-8 bg-slate-50/60">
            <form ref={formRef} onSubmit={handleSubmit} method="post">
              <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
          {/* Placement Date */}
          <PlacementDatePicker
            placementdate={placementdate}
            setplacementdate={setplacementdate}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
            formatDateToString={formatDateToString}
          />

          {/* Type of Transaction */}
          <TransactionTypeSelect
            t_o_t={t_o_t}
            sett_o_t={sett_o_t}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Execution Type */}
          <ExecutionTypeSelect
            e_t={e_t}
            sete_t={sete_t}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Bank Advice Ref No */}
          <BankAdviceRefNoInput
            bankadviserefno={bankadviserefno}
            setbankadviserefno={setbankadviserefno}
          />

          {/* Quantity */}
          <QuantityInput
            quantity={quantity}
            setquantity={setquantity}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Security Ticker/ISIN */}
          <SecurityTickerInput
            ticker={ticker}
            setticker={setticker}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Security Name */}
          <SecurityNameInput
            securityname={securityname}
            setsecurityname={setsecurityname}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Bank Notes */}
          <BankNotesInput
            banknotes={banknotes}
            setbanknotes={setbanknotes}
          />

          {/* Price per Security */}
          <PricePerSecurityInput
            pricepersecurity={pricepersecurity}
            setpricepersecurity={setpricepersecurity}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Effective Date */}
          <EffectiveDatePicker
            effectivedate={effectivedate}
            seteffectivedate={seteffectivedate}
            formatDateToString={formatDateToString}
          />

          {/* Maturity Date */}
          <MaturityDatePicker
            maturitydate={maturitydate}
            setmaturitydate={setmaturitydate}
            formatDateToString={formatDateToString}
          />

          {/* Amount */}
          <AmountDisplay
            amountDisplayValue={amountDisplayValue}
          />

          {/* Commission */}
          <CommissionInput
            commission={commission}
            setcommission={setcommission}
          />

          {/* Charges & Fees Abroad */}
          <ChargesAndFeesInput
            chargesandfees={chargesandfees}
            setchargesandfees={setchargesandfees}
          />

          {/* Federal Turnover Tax */}
          <FederalTurnoverTaxInput
            federalturnovertax={federalturnovertax}
            setfederalturnovertax={setfederalturnovertax}
          />

          {/* Currency */}
          <CurrencySelect
            p_currency={p_currency}
            setp_currency={setp_currency}
          />

          {/* Asset Type */}
          <AssetTypeOtherInput
            aassettype={aassettype}
            setaassettype={setaassettype}
          />

          {/* Bank */}
          <BankSelect
            bank={bank}
            setbank={setbank}
            setShowBankModal={setShowBankModal}
          />

          {/* Remarks / Comments */}
          <RemarksInput
            remarks={remarks}
            setRemarks={setRemarks}
          />

          {/* Purpose */}
          <PurposeInput
            description={description}
            setDescription={setDescription}
          />

          {/* Market Price */}
          <MarketPriceInput
            targetprice={targetprice}
            settargetprice={settargetprice}
            clearError={clearError}
            errors={errors}
            handleFieldBlur={handleFieldBlur}
            validateField={validateField}
          />

          {/* Relationship Manager */}
          <RelationshipManagerInput
            relationshipmanager={relationshipmanager}
            setrelationshipmanager={setrelationshipmanager}
          />
        </div>

        <div className="pb-10" />
      </form>
    </div>
  </div>
      </div>
      {showBankModal && (
      <BankModal
        isOpen={showBankModal}
        onClose={() => setShowBankModal(false)}
      />
      )}
      <FloatingFooter
        data={footerData}
        onSave={handleSave}
        isSaving={isSaving || loadingExisting}
        saveLabel={saveLabel}
      />
    </>
  );
}

export default function OtherAssetsForm() {
  return (
    <Suspense fallback={<div className="p-6 text-center text-sm text-slate-500">Loading form…</div>}>
      <OtherAssetsFormContent />
    </Suspense>
  );
}
