import { FixedDepositFormField } from "@/components/validation/FormFields";
import CurrencySelect from "@/fields/Currency";
import DepositAmountInput from "@/fields/DepositAmount";
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 MaturityDatePicker from "@/fields/MaturityDate";
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";

interface FixedDepositFormFieldsProps {
  formData: {
    p_currency: { label: string; value: string } | null;
    bank: { label: string; value: string } | null;
    durationUnit: { label: string; value: string } | null;
    bankadviserefno: string;
    placementdate: string;
    pricepersecurity: string;
    timeperiod: string;
    effectivedate: string;
    amount: string;
    chargesandfees: string;
    federalturnovertax: string;
    intrestperanum: string;
    description: string;
    remarks: string;
  };
  errors: Record<string, string>;
  clearError: (field: string) => void;
  handleFieldBlur: (field: FixedDepositFormField, validator: (field: FixedDepositFormField) => string | undefined) => void;
  validateField: (field: FixedDepositFormField) => string | undefined;
  updateFormData: (updates: any) => void;
  formatDateToString: (date: Date) => string;
  setShowBankModal: (show: boolean) => void;
}

export const FixedDepositFormFields = ({
  formData,
  errors,
  clearError,
  handleFieldBlur,
  validateField,
  updateFormData,
  formatDateToString,
  setShowBankModal,
}: FixedDepositFormFieldsProps) => {
  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 })}
      />

      {/* Deposit Amount */}
      <DepositAmountInput<FixedDepositFormField>
        amount={formData.amount}
        setamount={(amount) => updateFormData({ amount })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
      />

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

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

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

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

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

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

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

      {/* Premium */}
      <PremiumPaidInput<FixedDepositFormField>
        premiumpaid={formData.pricepersecurity}
        setpremiumpaid={(premium) => updateFormData({ pricepersecurity: premium })}
        clearError={clearError}
        errors={errors}
        handleFieldBlur={handleFieldBlur}
        validateField={validateField}
        fieldName="premium"
      />

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

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

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