import { CashDerivativesFormField } from "@/components/validation/FormFields";
import PlacementDatePicker from "@/fields/PlacementDate";
import CurrencyBoughtSelect from "@/fields/CurrencyBought";
import CurrencySoldSelect from "@/fields/CurrencySold";
import AmountBaseCurrency from "@/fields/AmountBaseCurrency";
import RateOfSwap from "@/fields/RateOfSwap";
import AmountSwapped from "@/fields/AmountSwapped";
import MaturityDatePicker from "@/fields/MaturityDate";
import BankAdviceRefNoInput from "@/fields/BankAdviceNo";
import CommissionInput from "@/fields/Comission";
import ChargesAndFeesInput from "@/fields/ChargesFeesAbroad";
import FederalTurnoverTaxInput from "@/fields/FederalTurnOver";
import BankSelect from "@/fields/Bank";
import RemarksInput from "@/fields/Remarks";
import PurposeInput from "@/fields/Purpose";

interface CashDerivativesFormFieldsProps {
  formData: {
    placementdate: string;
    currencybought: { label: string; value: string } | null;
    currencysold: { label: string; value: string } | null;
    amountbasecurrency: string;
    rateofswap: string;
    maturitydate: string;
    bankadviserefno: string;
    commission: string;
    chargesandfees: string;
    federalturnovertax: string;
    bank: { label: string; value: string } | null;
    remarks: string;
    description: string;
  };
  errors: Record<string, string>;
  clearError: (field: string) => void;
  handleFieldBlur: (field: CashDerivativesFormField, validator: (field: CashDerivativesFormField) => string | undefined) => void;
  validateField: (field: CashDerivativesFormField) => string | undefined;
  updateFormData: (updates: any) => void;
  formatDateToString: (date: Date) => string;
  setShowBankModal: (show: boolean) => void;
  amountSwappedDisplay: string;
}

export const CashDerivativesFormFields = ({
  formData,
  errors,
  clearError,
  handleFieldBlur,
  validateField,
  updateFormData,
  formatDateToString,
  setShowBankModal,
  amountSwappedDisplay,
}: CashDerivativesFormFieldsProps) => {
  return (
    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
      {/* Placement Date */}
      <PlacementDatePicker<CashDerivativesFormField>
        placementdate={formData.placementdate}
        setplacementdate={(date) => updateFormData({ placementdate: date })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
        formatDateToString={formatDateToString}
      />

      {/* Currency Bought */}
      <CurrencyBoughtSelect<CashDerivativesFormField>
        currencybought={formData.currencybought}
        setcurrencybought={(currency) => updateFormData({ currencybought: currency })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Currency Sold */}
      <CurrencySoldSelect<CashDerivativesFormField>
        currencysold={formData.currencysold}
        setcurrencysold={(currency) => updateFormData({ currencysold: currency })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Amount (Base Currency) */}
      <AmountBaseCurrency<CashDerivativesFormField>
        amountbasecurrency={formData.amountbasecurrency}
        setamountbasecurrency={(amount) => updateFormData({ amountbasecurrency: amount })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Rate of Swap */}
      <RateOfSwap<CashDerivativesFormField>
        rateofswap={formData.rateofswap}
        setrateofswap={(rate) => updateFormData({ rateofswap: rate })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Amount (Currency Swapped) */}
      <AmountSwapped
        amountSwappedDisplay={amountSwappedDisplay}
      />

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

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

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

      {/* Charges and fees abroad */}
      <ChargesAndFeesInput
        chargesandfees={formData.chargesandfees}
        setchargesandfees={(charges) => updateFormData({ chargesandfees: charges })}
      />

      {/* Federal turnover tax */}
      <FederalTurnoverTaxInput
        federalturnovertax={formData.federalturnovertax}
        setfederalturnovertax={(tax) => updateFormData({ federalturnovertax: tax })}
      />

      {/* 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 })}
      />
    </div>
  );
};
