import { LeverageFormField } from "@/components/validation/FormFields";
import CurrencySelect from "@/fields/Currency";
import LeverageAmountInput from "@/fields/LeverageAmount";
import TimePeriodInput from "@/fields/TimePeriodDuration";
import PlacementDatePicker from "@/fields/PlacementDate";
import BankAdviceRefNoInput from "@/fields/BankAdviceNo";
import InterestRateInput from "@/fields/IntrestPerAnum";
import BankSelect from "@/fields/Bank";
import TransactionCostsInput from "@/fields/TransactionCost";
import PremiumPaidInput from "@/fields/PremiumPaid";
import FederalTurnoverTaxInput from "@/fields/FederalTurnOver";
import RemarksInput from "@/fields/Remarks";
import PurposeInput from "@/fields/Purpose";
import DocumentUpload from "@/fields/FileUpload";

interface LeverageFormFieldsProps {
  formData: {
    p_currency: { label: string; value: string } | null;
    amount: string;
    timeperiod: string;
    placementdate: string;
    bankadviserefno: string;
    interestrateperanum: string;
    bank: { label: string; value: string } | null;
    transactioncost: string;
    premium: string;
    tax: string;
    remarks: string;
    description: string;
    selectedFile: File | null;
    durationUnit: { label: string; value: string } | null;
  };
  errors: Record<string, string>;
  clearError: (field: string) => void;
  handleFieldBlur: (field: LeverageFormField, validator: (field: LeverageFormField) => string | undefined) => void;
  validateField: (field: LeverageFormField) => string | undefined;
  updateFormData: (updates: any) => void;
  formatDateToString: (date: Date) => string;
  setShowBankModal: (show: boolean) => void;
}

export const LeverageFormFields = ({
  formData,
  errors,
  clearError,
  handleFieldBlur,
  validateField,
  updateFormData,
  formatDateToString,
  setShowBankModal,
}: LeverageFormFieldsProps) => {
  return (
    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
      {/* Currency */}
      <CurrencySelect
        p_currency={formData.p_currency}
        setp_currency={(currency) => updateFormData({ p_currency: currency })}
      />

      {/* Amount */}
      <LeverageAmountInput<LeverageFormField>
        amount={formData.amount}
        setamount={(amount) => updateFormData({ amount })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Time Period + Duration Unit */}
      <TimePeriodInput<LeverageFormField>
        timeperiod={formData.timeperiod}
        settimeperiod={(timeperiod) => updateFormData({ timeperiod })}
        durationUnit={formData.durationUnit}
        setDurationUnit={(durationUnit) => updateFormData({ durationUnit })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Placement Date */}
      <PlacementDatePicker<LeverageFormField>
        placementdate={formData.placementdate}
        setplacementdate={(placementdate) => updateFormData({ placementdate })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
        formatDateToString={formatDateToString}
      />

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

      {/* Interest Rate per Annum (%) */}
      <InterestRateInput<LeverageFormField>
        intrestperanum={formData.interestrateperanum}
        setintrestperanum={(interestrateperanum) => updateFormData({ interestrateperanum })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

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

      {/* Transaction Costs */}
      <TransactionCostsInput<LeverageFormField>
        chargesandfees={formData.transactioncost}
        setchargesandfees={(transactioncost) => updateFormData({ transactioncost })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

      {/* Premium */}
      <PremiumPaidInput<LeverageFormField>
        premiumpaid={formData.premium}
        setpremiumpaid={(premium) => updateFormData({ premium })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

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

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

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

      {/* File Upload */}
      <DocumentUpload
        setSelectedFile={(selectedFile) => updateFormData({ selectedFile })}
      />
    </div>
  );
};
