import type { VbenFormApi, VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesQcIndicatorApi } from '#/api/mes/qc/indicator';

import { h, markRaw } from 'vue';

import {
  DICT_TYPE,
  MesAutoCodeRuleCode,
  MesQcIndicatorItemType,
  MesQcResultValueType,
} from '@vben/constants';
import { getDictOptions } from '@vben/hooks';

import { Button } from 'ant-design-vue';

import { z } from '#/adapter/form';
import { generateAutoCode } from '#/api/mes/md/autocode/record';
import { getIndicatorGroupList } from '#/api/mes/qc/indicator';

import { QcIndicatorResultSpecificationInput } from './components';

/** 新增/修改的表单 */
export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] {
  return [
    {
      fieldName: 'id',
      component: 'Input',
      dependencies: {
        triggerFields: [''],
        show: () => false,
      },
    },
    {
      fieldName: 'code',
      label: '检测项编码',
      component: 'Input',
      componentProps: {
        maxlength: 64,
        placeholder: '请输入检测项编码',
      },
      rules: 'required',
      suffix: () =>
        h(
          Button,
          {
            type: 'default',
            onClick: async () => {
              const code = await generateAutoCode(
                MesAutoCodeRuleCode.QC_INDICATOR_CODE,
              );
              await formApi?.setFieldValue('code', code);
            },
          },
          { default: () => '自动生成' },
        ),
    },
    {
      fieldName: 'name',
      label: '检测项名称',
      component: 'Input',
      componentProps: {
        maxlength: 100,
        placeholder: '请输入检测项名称',
      },
      rules: 'required',
    },
    {
      fieldName: 'itemType',
      label: '条目类型',
      component: 'RadioGroup',
      componentProps: {
        buttonStyle: 'solid',
        optionType: 'button',
        options: [
          { label: '录入项', value: MesQcIndicatorItemType.ENTRY },
          { label: '分组项', value: MesQcIndicatorItemType.GROUP },
        ],
      },
      dependencies: {
        triggerFields: ['itemType'],
        // 切成分组项时清掉只属于录入项的字段；分组项必须顶级，残留的 parentId 会被后端层级校验顶回来
        trigger: (values) => {
          if (values.itemType === MesQcIndicatorItemType.GROUP) {
            formApi?.setFieldValue('parentId', 0);
            formApi?.setFieldValue('resultType', undefined);
            formApi?.setFieldValue('resultSpecification', undefined);
          }
        },
      },
      rules: z.number().default(MesQcIndicatorItemType.ENTRY),
    },
    {
      fieldName: 'parentId',
      label: '所属分组',
      component: 'ApiTreeSelect',
      componentProps: {
        allowClear: true,
        // 父级候选只有分组项：分组项只能是顶级，所以这里是一层平铺，不需要 handleTree
        api: async () => {
          const data = await getIndicatorGroupList();
          return [
            {
              id: 0,
              name: '顶级指标',
              children: data,
            },
          ];
        },
        childrenField: 'children',
        labelField: 'name',
        placeholder: '请选择所属分组，不选则为顶级指标',
        treeDefaultExpandAll: true,
        treeNodeFilterProp: 'name',
        valueField: 'id',
      },
      dependencies: {
        triggerFields: ['itemType'],
        if: (values) => values.itemType !== MesQcIndicatorItemType.GROUP,
      },
      defaultValue: 0,
    },
    {
      fieldName: 'type',
      label: '检测项类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'),
        placeholder: '请选择检测项类型',
      },
      rules: 'required',
    },
    {
      fieldName: 'tool',
      label: '检测工具',
      component: 'Input',
      componentProps: {
        maxlength: 100,
        placeholder: '请输入检测工具',
      },
    },
    {
      fieldName: 'formulaText',
      label: '公式',
      component: 'Textarea',
      componentProps: {
        maxlength: 500,
        placeholder: '请输入公式，报告里作为该分组的检测要求展示',
        rows: 2,
      },
      dependencies: {
        triggerFields: ['itemType'],
        if: (values) => values.itemType === MesQcIndicatorItemType.GROUP,
      },
      rules: 'required',
    },
    {
      fieldName: 'sortOrder',
      label: '排序号',
      component: 'InputNumber',
      componentProps: {
        min: 0,
        placeholder: '留空自动排到同级末尾',
      },
    },
    {
      fieldName: 'resultType',
      label: '结果值类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        // 结果值类型变化时清空结果值属性
        onChange: () =>
          formApi?.setFieldValue('resultSpecification', undefined),
        options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'),
        placeholder: '请选择结果值类型',
      },
      // 分组项没有结果值，不展示也不校验（落库时后端同样会清空）
      dependencies: {
        triggerFields: ['itemType'],
        if: (values) => values.itemType !== MesQcIndicatorItemType.GROUP,
      },
      rules: 'required',
    },
    {
      fieldName: 'resultSpecification',
      label: '结果值属性',
      component: markRaw(QcIndicatorResultSpecificationInput),
      // 按结果值类型在组件内部切换文件类型 RadioGroup / 字典类型 ApiSelect
      dependencies: {
        triggerFields: ['resultType'],
        if: (values) =>
          values.resultType === MesQcResultValueType.FILE ||
          values.resultType === MesQcResultValueType.DICT,
        componentProps: (values) => ({
          resultType: values.resultType,
        }),
      },
      rules: 'required',
    },
    {
      fieldName: 'remark',
      label: '备注',
      component: 'Textarea',
      componentProps: {
        maxlength: 250,
        placeholder: '请输入备注',
        rows: 3,
      },
    },
  ];
}

/** 列表的搜索表单 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'code',
      label: '检测项编码',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入检测项编码',
      },
    },
    {
      fieldName: 'name',
      label: '检测项名称',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入检测项名称',
      },
    },
    {
      fieldName: 'itemType',
      label: '条目类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: [
          { label: '录入项', value: MesQcIndicatorItemType.ENTRY },
          { label: '分组项', value: MesQcIndicatorItemType.GROUP },
        ],
        placeholder: '请选择条目类型',
      },
    },
    {
      fieldName: 'type',
      label: '检测项类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'),
        placeholder: '请选择检测项类型',
      },
    },
    {
      fieldName: 'resultType',
      label: '结果值类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'),
        placeholder: '请选择结果值类型',
      },
    },
  ];
}

/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions<MesQcIndicatorApi.Indicator>['columns'] {
  return [
    {
      field: 'code',
      title: '检测项编码',
      width: 140,
    },
    {
      field: 'name',
      title: '检测项名称',
      minWidth: 160,
    },
    {
      field: 'itemType',
      title: '条目类型',
      width: 100,
      slots: { default: 'itemType' },
    },
    {
      field: 'parentName',
      title: '所属分组',
      width: 140,
      slots: { default: 'parentName' },
    },
    {
      field: 'type',
      title: '检测项类型',
      width: 120,
      slots: { default: 'type' },
    },
    {
      field: 'tool',
      title: '检测工具',
      width: 140,
    },
    {
      field: 'resultType',
      title: '结果值类型',
      width: 120,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_QC_RESULT_TYPE },
      },
    },
    {
      field: 'remark',
      title: '备注',
      minWidth: 160,
    },
    {
      field: 'createTime',
      title: '创建时间',
      width: 180,
      formatter: 'formatDateTime',
    },
    {
      title: '操作',
      width: 160,
      fixed: 'right',
      slots: { default: 'actions' },
    },
  ];
}

/** 选择弹窗的搜索表单 */
export function useSelectGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'name',
      label: '检测项名称',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入检测项名称',
      },
    },
    {
      fieldName: 'type',
      label: '检测项类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'),
        placeholder: '请选择检测项类型',
      },
    },
  ];
}

/** 选择弹窗的字段 */
export function useSelectGridColumns(
  multiple = true,
): VxeTableGridOptions<MesQcIndicatorApi.Indicator>['columns'] {
  return [
    {
      type: multiple ? 'checkbox' : 'radio',
      width: 50,
    },
    {
      field: 'code',
      title: '检测项编码',
      width: 140,
    },
    {
      field: 'name',
      title: '检测项名称',
      minWidth: 160,
    },
    {
      field: 'type',
      title: '检测项类型',
      width: 120,
      slots: { default: 'type' },
    },
    {
      field: 'tool',
      title: '检测工具',
      width: 120,
    },
    {
      field: 'remark',
      title: '备注',
      minWidth: 140,
    },
  ];
}
