import type { UseFormRegisterReturn } from 'react-hook-form';
import { digitsOnly, toEnglishDigits } from './utils';

/**
 * فیلدهای عددی React Hook Form: ارقام فارسی/عربی را حین تایپ به لاتین تبدیل می‌کند.
 *
 * چرا `type="text"`؟ چون `type="number"` روی ارقام فارسی مقدار را نامعتبر می‌داند
 * و `e.target.value` رشتهٔ خالی برمی‌گرداند — یعنی داده از دست می‌رود و هیچ
 * onChange‌ای نجاتش نمی‌دهد.
 */
type NumericFieldProps = UseFormRegisterReturn & {
  type: 'text';
  inputMode: 'numeric';
  dir: 'ltr';
};

function wrap(
  reg: UseFormRegisterReturn,
  normalize: (raw: string) => string,
): NumericFieldProps {
  return {
    ...reg,
    type: 'text',
    inputMode: 'numeric',
    dir: 'ltr',
    onChange: (event: { target: any; type?: any }) => {
      event.target.value = normalize(String(event.target.value ?? ''));
      return reg.onChange(event);
    },
  };
}

/** فقط ارقام لاتین — برای موبایل، کد ملی، مبلغ، درصد، تعداد. */
export function numericField(reg: UseFormRegisterReturn, maxDigits?: number): NumericFieldProps {
  return wrap(reg, (raw) => digitsOnly(raw, maxDigits));
}

/**
 * فقط ترجمهٔ رقم؛ جداکننده‌ها و حروف حفظ می‌شوند — برای شبا (`IR…`) و
 * تلفن ثابت (`021-1234…`).
 */
export function latinDigitsField(reg: UseFormRegisterReturn): NumericFieldProps {
  return wrap(reg, toEnglishDigits);
}
