import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { HrmSocialSecuritySchemeApi } from '#/api/hrm/salary/social-security-scheme';

/** 表单类型 */
export type FormType = 'create' | 'update';

/** 格式化比例输入 */
function createRatioFormatter(step: number = 0.01) {
  return {
    formatter: (value: number) => value !== undefined && value !== null ? `${(value * 100).toFixed(step === 0.001 ? 1 : 0)}%` : '',
    parser: (value: string) => {
      const num = parseFloat(value.replace('%', ''));
      return isNaN(num) ? 0 : num / 100;
    },
  };
}

/** 新增/修改社保公积金方案的表单 */
export function useFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'id',
      component: 'Input',
      dependencies: {
        triggerFields: [''],
        show: () => false,
      },
    },
    {
      fieldName: 'name',
      label: '方案名称',
      component: 'Input',
      componentProps: {
        placeholder: '请输入方案名称，如：2024年南通市标准',
      },
      rules: 'required',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'effectiveDate',
      label: '生效日期',
      component: 'DatePicker',
      componentProps: {
        placeholder: '请选择生效日期',
        valueFormat: 'YYYY-MM-DD',
        style: { width: '100%' },
      },
      rules: 'required',
    },
    {
      fieldName: 'status',
      label: '状态',
      component: 'RadioGroup',
      componentProps: {
        options: [
          { label: '启用', value: 0 },
          { label: '禁用', value: 1 },
        ],
      },
      rules: 'required',
    },
    // 养老保险
    {
      fieldName: 'divider_pension',
      label: '养老保险',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'pensionCompanyRatio',
      label: '企业比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '企业缴纳比例',
        min: 0,
        max: 1,
        step: 0.01,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(),
      },
    },
    {
      fieldName: 'pensionPersonalRatio',
      label: '个人比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '个人缴纳比例',
        min: 0,
        max: 1,
        step: 0.01,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(),
      },
    },
    // 医疗保险
    {
      fieldName: 'divider_medical',
      label: '医疗保险',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'medicalCompanyRatio',
      label: '企业比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '企业缴纳比例',
        min: 0,
        max: 1,
        step: 0.01,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(),
      },
    },
    {
      fieldName: 'medicalPersonalRatio',
      label: '个人比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '个人缴纳比例',
        min: 0,
        max: 1,
        step: 0.01,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(),
      },
    },
    // 失业保险
    {
      fieldName: 'divider_unemployment',
      label: '失业保险',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'unemploymentCompanyRatio',
      label: '企业比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '企业缴纳比例',
        min: 0,
        max: 1,
        step: 0.001,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(0.001),
      },
    },
    {
      fieldName: 'unemploymentPersonalRatio',
      label: '个人比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '个人缴纳比例',
        min: 0,
        max: 1,
        step: 0.001,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(0.001),
      },
    },
    // 工伤/生育保险
    {
      fieldName: 'divider_other',
      label: '工伤/生育保险',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'workInjuryRatio',
      label: '工伤保险',
      component: 'InputNumber',
      componentProps: {
        placeholder: '工伤保险比例',
        min: 0,
        max: 1,
        step: 0.001,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(0.001),
      },
    },
    {
      fieldName: 'maternityRatio',
      label: '生育保险',
      component: 'InputNumber',
      componentProps: {
        placeholder: '生育保险比例',
        min: 0,
        max: 1,
        step: 0.001,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(0.001),
      },
    },
    // 公积金
    {
      fieldName: 'divider_housing',
      label: '公积金',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'housingFundCompanyRatio',
      label: '企业比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '企业缴纳比例',
        min: 0,
        max: 1,
        step: 0.01,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(),
      },
    },
    {
      fieldName: 'housingFundPersonalRatio',
      label: '个人比例',
      component: 'InputNumber',
      componentProps: {
        placeholder: '个人缴纳比例',
        min: 0,
        max: 1,
        step: 0.01,
        precision: 4,
        style: { width: '100%' },
        ...createRatioFormatter(),
      },
    },
    // 备注
    {
      fieldName: 'remark',
      label: '备注',
      component: 'Textarea',
      componentProps: {
        placeholder: '请输入备注',
        rows: 2,
      },
      formItemClass: 'col-span-2',
    },
  ];
}

/** 列表的搜索表单 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'name',
      label: '方案名称',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入方案名称',
      },
    },
    {
      fieldName: 'status',
      label: '状态',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: [
          { label: '启用', value: 0 },
          { label: '禁用', value: 1 },
        ],
        placeholder: '请选择状态',
      },
    },
  ];
}

/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions<HrmSocialSecuritySchemeApi.SocialSecurityScheme>['columns'] {
  return [
    { field: 'name', title: '方案名称', minWidth: 180 },
    { field: 'effectiveDate', title: '生效日期', width: 110 },
    {
      field: 'pensionCompanyRatio',
      title: '养老(企业)',
      width: 100,
      slots: { default: 'pensionCompanyRatio' },
    },
    {
      field: 'pensionPersonalRatio',
      title: '养老(个人)',
      width: 100,
      slots: { default: 'pensionPersonalRatio' },
    },
    {
      field: 'medicalPersonalRatio',
      title: '医疗(个人)',
      width: 100,
      slots: { default: 'medicalPersonalRatio' },
    },
    {
      field: 'housingFundPersonalRatio',
      title: '公积金(个人)',
      width: 100,
      slots: { default: 'housingFundPersonalRatio' },
    },
    {
      field: 'status',
      title: '状态',
      width: 80,
      slots: { default: 'status' },
    },
    {
      field: 'createTime',
      title: '创建时间',
      width: 180,
      formatter: 'formatDateTime',
    },
    {
      title: '操作',
      width: 150,
      fixed: 'right',
      slots: { default: 'actions' },
    },
  ];
}
