import type { Translations } from '@/locales';
import type { FieldType, FieldTypeConfig } from './types';

export function getFieldTypeLabel(
  t: Translations,
  type: FieldType,
  fallback: string
): string {
  const map: Partial<Record<FieldType, string>> = {
    text: t.forms.designer.fieldTypes.text,
    textarea: t.forms.designer.fieldTypes.textarea,
    number: t.forms.designer.fieldTypes.number,
    rating: t.forms.designer.fieldTypes.rating,
    radio: t.forms.designer.fieldTypes.radio,
    checkbox: t.forms.designer.fieldTypes.checkbox,
    select: t.forms.designer.fieldTypes.select,
    multiSelect: t.forms.designer.fieldTypes.multiSelect,
    member: t.forms.designer.fieldTypes.member,
    department: t.forms.designer.fieldTypes.department,
    date: t.forms.designer.fieldTypes.date,
    dateRange: t.forms.designer.fieldTypes.dateRange,
    datetime: t.forms.designer.fieldTypes.datetime,
    time: t.forms.designer.fieldTypes.time,
    image: t.forms.designer.fieldTypes.image,
    file: t.forms.designer.fieldTypes.file,
    detail: t.forms.designer.fieldTypes.detail,
    container: t.forms.designer.fieldTypes.container,
    group: t.forms.designer.fieldTypes.group,
    serialNumber: t.forms.designer.fieldTypes.serialNumber,
    relatedForm: t.forms.designer.fieldTypes.relatedForm,
    relatedQuery: t.forms.designer.fieldTypes.relatedQuery,
    address: t.forms.designer.fieldTypes.address,
    region: t.forms.designer.fieldTypes.region,
    location: t.forms.designer.fieldTypes.location,
    cascade: t.forms.designer.fieldTypes.cascade,
    signature: t.forms.designer.fieldTypes.signature,
    seal: t.forms.designer.fieldTypes.seal,
    richtext: t.forms.designer.fieldTypes.richText,
    imageText: t.forms.designer.fieldTypes.imageText,
    wordTemplate: t.forms.designer.fieldTypes.wordTemplate,
    currency: t.forms.designer.fieldTypes.currency,
    email: t.forms.designer.fieldTypes.email,
    phone: t.forms.designer.fieldTypes.phone,
    url: t.forms.designer.fieldTypes.url,
    money: t.forms.designer.fieldTypes.money,
    switch: t.forms.designer.fieldTypes.switch,
  };

  return map[type] || fallback;
}

export function getDefaultPlaceholder(
  t: Translations,
  type: FieldType,
  fallback?: string
): string | undefined {
  const map: Partial<Record<FieldType, string>> = {
    text: t.forms.designer.defaults.input,
    textarea: t.forms.designer.defaults.input,
    number: t.forms.designer.defaults.number,
    rating: undefined,
    radio: undefined,
    checkbox: undefined,
    select: t.forms.designer.defaults.select,
    multiSelect: t.forms.designer.defaults.select,
    member: t.forms.designer.defaults.member,
    department: t.forms.designer.defaults.department,
    date: t.forms.designer.defaults.date,
    dateRange: t.forms.designer.defaults.date,
    datetime: t.forms.designer.defaults.date,
    time: t.forms.designer.defaults.date,
    image: undefined,
    file: undefined,
    detail: undefined,
    container: undefined,
    group: undefined,
    serialNumber: undefined,
    relatedForm: t.forms.designer.defaults.related,
    relatedQuery: t.forms.designer.defaults.related,
    address: t.forms.designer.defaults.address,
    region: t.forms.designer.defaults.select,
    location: t.forms.designer.defaults.location,
    cascade: t.forms.designer.defaults.select,
    signature: undefined,
    seal: undefined,
    richtext: undefined,
    imageText: undefined,
    wordTemplate: undefined,
    currency: t.forms.designer.defaults.amount,
    email: t.forms.designer.defaults.input,
    phone: t.forms.designer.defaults.input,
    url: t.forms.designer.defaults.input,
    money: t.forms.designer.defaults.amount,
    switch: undefined,
  };

  return map[type] ?? fallback;
}

export function getDefaultOptionLabel(t: Translations, index: number): string {
  return t.forms.designer.defaults.optionLabel.replace('{index}', String(index));
}

export function localizeFieldConfig(
  t: Translations,
  config: FieldTypeConfig
): FieldTypeConfig {
  const label = getFieldTypeLabel(t, config.type, config.label);
  const defaultProps = { ...config.defaultProps };

  if (defaultProps.placeholder) {
    defaultProps.placeholder = getDefaultPlaceholder(
      t,
      config.type,
      String(defaultProps.placeholder)
    );
  }

  if (config.type === 'group' && defaultProps.label) {
    defaultProps.label = t.forms.designer.defaults.groupTitle;
  }

  if (defaultProps.options && Array.isArray(defaultProps.options)) {
    defaultProps.options = defaultProps.options.map((opt, index) => ({
      ...opt,
      label: getDefaultOptionLabel(t, index + 1),
    }));
  }

  return {
    ...config,
    label,
    defaultProps,
  };
}
