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";
import { OtherAssetsFormField } from "@/hooks/useOtherAssetsForm";
import { formatDateToString } from "@/lib/common";

interface OtherAssetsFormFieldsProps {
  formData: {
    t_o_t: { label: string; value: string } | null;
    e_t: { label: string; value: string } | null;
    p_currency: { label: string; value: string } | null;
    aassettype: string;
    bank: { label: string; value: string } | null;
    bankadviserefno: string;
    placementdate: string;
    quantity: string;
    ticker: string;
    securityname: string;
    pricepersecurity: string;
    effectivedate: string;
    maturitydate: string;
    amount: string;
    commission: string;
    chargesandfees: string;
    federalturnovertax: string;
    targetprice: string;
    relationshipmanager: string;
    description: string;
    banknotes: string;
    remarks: string;
  };
  amountDisplayValue: string;
  errors: Record<string, string>;
  clearError: (field: string) => void;
  handleFieldBlur: (field: OtherAssetsFormField, validateField: (field: OtherAssetsFormField) => string | undefined) => void;
  validateField: (field: OtherAssetsFormField) => string | undefined;
  updateFormData: (updates: any) => void;
  formatDateToString: (date: Date) => string;
  setShowBankModal: (show: boolean) => void;
}

export const OtherAssetsFormFields = ({
  formData,
  amountDisplayValue,
  errors,
  clearError,
  handleFieldBlur,
  validateField,
  updateFormData,
  formatDateToString,
  setShowBankModal,
}: OtherAssetsFormFieldsProps) => {
  return (
    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
      {/* Placement Date */}
      <PlacementDatePicker<OtherAssetsFormField>
        placementdate={formData.placementdate}
        setplacementdate={(placementdate) => updateFormData({ placementdate })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
        formatDateToString={formatDateToString}
      />

      {/* Type of Transaction */}
      <TransactionTypeSelect<OtherAssetsFormField>
        t_o_t={formData.t_o_t}
        sett_o_t={(t_o_t) => updateFormData({ t_o_t })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Execution Type */}
      <ExecutionTypeSelect<OtherAssetsFormField>
        e_t={formData.e_t}
        sete_t={(e_t) => updateFormData({ e_t })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Bank Advice Ref No */}
      <BankAdviceRefNoInput
        bankadviserefno={formData.bankadviserefno}
        setbankadviserefno={(bankadviserefno) => updateFormData({ bankadviserefno })}
      />

      {/* Quantity */}
      <QuantityInput<OtherAssetsFormField>
        quantity={formData.quantity}
        setquantity={(quantity) => updateFormData({ quantity })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Security Ticker/ISIN */}
      <SecurityTickerInput<OtherAssetsFormField>
        ticker={formData.ticker}
        setticker={(ticker) => updateFormData({ ticker })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Security Name */}
      <SecurityNameInput<OtherAssetsFormField>
        securityname={formData.securityname}
        setsecurityname={(securityname) => updateFormData({ securityname })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Bank Notes */}
      <BankNotesInput
        banknotes={formData.banknotes}
        setbanknotes={(banknotes) => updateFormData({ banknotes })}
      />

      {/* Price per Security */}
      <PricePerSecurityInput<OtherAssetsFormField>
        pricepersecurity={formData.pricepersecurity}
        setpricepersecurity={(pricepersecurity) => updateFormData({ pricepersecurity })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Effective Date */}
      <EffectiveDatePicker
        effectivedate={formData.effectivedate}
        seteffectivedate={(effectivedate) => updateFormData({ effectivedate })}
        formatDateToString={formatDateToString}
      />

      {/* Maturity Date */}
      <MaturityDatePicker
        maturitydate={formData.maturitydate}
        setmaturitydate={(maturitydate) => updateFormData({ maturitydate })}
        formatDateToString={formatDateToString}
      />

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

      {/* Commission */}
      <CommissionInput
        commission={formData.commission}
        setcommission={(commission) => updateFormData({ commission })}
      />

      {/* Charges & Fees Abroad */}
      <ChargesAndFeesInput
        chargesandfees={formData.chargesandfees}
        setchargesandfees={(chargesandfees) => updateFormData({ chargesandfees })}
      />

      {/* Federal Turnover Tax */}
      <FederalTurnoverTaxInput
        federalturnovertax={formData.federalturnovertax}
        setfederalturnovertax={(federalturnovertax) => updateFormData({ federalturnovertax })}
      />

      {/* Currency */}
      <CurrencySelect
        p_currency={formData.p_currency}
        setp_currency={(p_currency) => updateFormData({ p_currency })}
      />

      {/* Asset Type */}
      <AssetTypeOtherInput
        aassettype={formData.aassettype}
        setaassettype={(aassettype) => updateFormData({ aassettype })}
      />

      {/* Bank */}
      <BankSelect
        bank={formData.bank}
        setbank={(bank) => updateFormData({ bank })}
        setShowBankModal={setShowBankModal}
      />

      {/* Remarks / Comments */}
      <RemarksInput
        remarks={formData.remarks}
        setRemarks={(remarks) => updateFormData({ remarks })}
      />

      {/* Purpose */}
      <PurposeInput
        description={formData.description}
        setDescription={(description) => updateFormData({ description })}
      />

      {/* Market Price */}
      <MarketPriceInput<OtherAssetsFormField>
        targetprice={formData.targetprice}
        settargetprice={(targetprice) => updateFormData({ targetprice })}
        clearError={(field: string) => clearError(field as OtherAssetsFormField)}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Relationship Manager */}
      <RelationshipManagerInput
        relationshipmanager={formData.relationshipmanager}
        setrelationshipmanager={(relationshipmanager) => updateFormData({ relationshipmanager })}
      />
    </div>
  );
};
