import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { MesDvMeteringApi } from '#/api/mes/dv/metering';

import {
  DICT_TYPE,
  MesDvMeteringExpireStatusEnum,
  MesDvMeteringStatusEnum,
} from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { handleTree } from '@vben/utils';

import { z } from '#/adapter/form';
import { getSimpleDeptList } from '#/api/system/dept';
import { getSimpleUserList } from '#/api/system/user';

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

/** 到期状态展示配置 */
export const METERING_EXPIRE_STATUS_OPTIONS: {
  color: string;
  label: string;
  value: number;
}[] = [
  {
    label: '已过期',
    value: MesDvMeteringExpireStatusEnum.OVERDUE,
    color: 'red',
  },
  {
    label: '即将到期',
    value: MesDvMeteringExpireStatusEnum.WITHIN,
    color: 'orange',
  },
  {
    label: '正常',
    value: MesDvMeteringExpireStatusEnum.NORMAL,
    color: 'green',
  },
];

/** 新增/修改计量器具的表单 */
export function useFormSchema(formType: FormType): VbenFormSchema[] {
  return [
    {
      fieldName: 'id',
      component: 'Input',
      dependencies: {
        triggerFields: [''],
        show: () => false,
      },
    },
    {
      fieldName: 'code',
      label: '器具编码',
      component: 'Input',
      componentProps: {
        placeholder: '请输入器具编码',
      },
      dependencies: {
        triggerFields: ['id'],
        componentProps: (values) => ({ disabled: !!values.id }),
      },
      rules: 'required',
    },
    {
      fieldName: 'name',
      label: '器具名称',
      component: 'Input',
      componentProps: {
        placeholder: '请输入器具名称',
      },
      rules: 'required',
    },
    {
      fieldName: 'category',
      label: '器具类别',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_DV_METERING_CATEGORY, 'number'),
        placeholder: '请选择器具类别',
      },
      help: '如卡尺、压力表、温度计等，不同类别有常见的校准周期',
      rules: 'selectRequired',
    },
    {
      fieldName: 'specification',
      label: '规格型号',
      component: 'Input',
      componentProps: {
        placeholder: '请输入规格型号',
      },
    },
    {
      fieldName: 'brand',
      label: '品牌/生产厂家',
      component: 'Input',
      componentProps: {
        placeholder: '请输入品牌/生产厂家',
      },
    },
    {
      fieldName: 'precision',
      label: '精度',
      component: 'Input',
      componentProps: {
        placeholder: '请输入精度',
      },
      help: '测量精度，如 0.01mm',
    },
    {
      fieldName: 'range',
      label: '量程',
      component: 'Input',
      componentProps: {
        placeholder: '请输入量程',
      },
      help: '测量范围，如 0~150mm',
    },
    {
      fieldName: 'deptId',
      label: '使用部门',
      component: 'ApiTreeSelect',
      componentProps: {
        api: async () => handleTree(await getSimpleDeptList()),
        childrenField: 'children',
        labelField: 'name',
        placeholder: '请选择使用部门',
        valueField: 'id',
      },
    },
    {
      fieldName: 'chargeUserId',
      label: '责任人',
      component: 'ApiSelect',
      componentProps: {
        allowClear: true,
        api: getSimpleUserList,
        labelField: 'nickname',
        placeholder: '请选择责任人',
        valueField: 'id',
      },
      help: '该器具的维护责任人，到期提醒的站内信会发给他',
    },
    {
      fieldName: 'checkCycleCount',
      label: '校准周期',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 1,
        precision: 0,
        placeholder: '请输入校准周期',
        suffix: '月',
      },
      help: '器具每隔 N 个月须校准/检定一次；新增检测记录时不填下次检测日期，将按「检测日期 + 校准周期」自动计算',
      rules: 'required',
    },
    {
      fieldName: 'useDate',
      label: '投入使用日期',
      component: 'DatePicker',
      componentProps: {
        class: '!w-full',
        format: 'YYYY-MM-DD',
        placeholder: '请选择投入使用日期',
        valueFormat: 'YYYY-MM-DD',
      },
      help: '器具开始投入使用的日期（仅作记录）',
    },
    {
      fieldName: 'lastCheckDate',
      label: '上次检测日期',
      component: 'DatePicker',
      componentProps: {
        class: '!w-full',
        disabled: true,
        format: 'YYYY-MM-DD',
        placeholder: '上次检测日期',
        valueFormat: 'YYYY-MM-DD',
      },
      help: '由最新一条检测记录自动回写，不可手动修改',
      dependencies: {
        triggerFields: ['id'],
        show: () => formType === 'detail',
      },
    },
    {
      fieldName: 'nextCheckDate',
      label: '下次检测日期',
      component: 'DatePicker',
      componentProps: {
        class: '!w-full',
        disabled: true,
        format: 'YYYY-MM-DD',
        placeholder: '下次检测日期',
        valueFormat: 'YYYY-MM-DD',
      },
      help: '到期日，由检测记录自动计算回写；到期前 N 天（基础设施配置）将提醒责任人',
      dependencies: {
        triggerFields: ['id'],
        show: () => formType === 'detail',
      },
    },
    {
      fieldName: 'status',
      label: '器具状态',
      component: 'RadioGroup',
      componentProps: {
        buttonStyle: 'solid',
        optionType: 'button',
        options: getDictOptions(DICT_TYPE.MES_DV_METERING_STATUS, 'number'),
      },
      help: '在用/停用/报废',
      rules: z.number().default(MesDvMeteringStatusEnum.IN_USE),
    },
    {
      fieldName: 'remark',
      label: '备注',
      component: 'Textarea',
      formItemClass: 'col-span-3',
      componentProps: {
        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: 'category',
      label: '器具类别',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_DV_METERING_CATEGORY, 'number'),
        placeholder: '请选择器具类别',
      },
    },
    {
      fieldName: 'deptId',
      label: '使用部门',
      component: 'ApiTreeSelect',
      componentProps: {
        allowClear: true,
        api: async () => handleTree(await getSimpleDeptList()),
        childrenField: 'children',
        labelField: 'name',
        placeholder: '请选择使用部门',
        valueField: 'id',
      },
    },
    {
      fieldName: 'chargeUserId',
      label: '责任人',
      component: 'ApiSelect',
      componentProps: {
        allowClear: true,
        api: getSimpleUserList,
        labelField: 'nickname',
        placeholder: '请选择责任人',
        valueField: 'id',
      },
    },
    {
      fieldName: 'status',
      label: '器具状态',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.MES_DV_METERING_STATUS, 'number'),
        placeholder: '请选择器具状态',
      },
    },
    {
      fieldName: 'expireStatus',
      label: '到期状态',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: METERING_EXPIRE_STATUS_OPTIONS,
        placeholder: '请选择到期状态',
      },
      help: '下次检测日期距今天 ≤ 提醒天数（基础设施配置 mes.dv-metering.remind-days）即视为「即将到期」',
    },
  ];
}

/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions<MesDvMeteringApi.Metering>['columns'] {
  return [
    {
      field: 'code',
      title: '器具编码',
      minWidth: 150,
      slots: {
        default: 'code',
      },
    },
    { field: 'name', title: '器具名称', minWidth: 150 },
    {
      field: 'category',
      title: '器具类别',
      width: 110,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_DV_METERING_CATEGORY },
      },
    },
    { field: 'specification', title: '规格型号', minWidth: 130 },
    { field: 'brand', title: '品牌/生产厂家', minWidth: 130 },
    { field: 'deptName', title: '使用部门', minWidth: 130 },
    { field: 'chargeUserNickname', title: '责任人', minWidth: 100 },
    {
      field: 'expireStatus',
      title: '到期状态',
      width: 110,
      slots: {
        default: 'expireStatus',
      },
    },
    {
      field: 'nextCheckDate',
      title: '下次检测日期',
      width: 130,
      formatter: 'formatDate',
    },
    {
      field: 'status',
      title: '器具状态',
      width: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_DV_METERING_STATUS },
      },
    },
    {
      field: 'createTime',
      title: '创建时间',
      width: 180,
      formatter: 'formatDateTime',
    },
    {
      title: '操作',
      width: 210,
      fixed: 'right',
      slots: {
        default: 'actions',
      },
    },
  ];
}

/** 计量器具选择弹窗的搜索表单 */
export function useMeteringSelectGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'code',
      label: '器具编码',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入器具编码',
      },
    },
    {
      fieldName: 'name',
      label: '器具名称',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入器具名称',
      },
    },
  ];
}

/** 计量器具选择弹窗的字段 */
export function useMeteringSelectGridColumns(
  multiple = false,
): VxeTableGridOptions<MesDvMeteringApi.Metering>['columns'] {
  return [
    { type: multiple ? 'checkbox' : 'radio', width: 50 },
    { field: 'code', title: '器具编码', width: 140 },
    { field: 'name', title: '器具名称', minWidth: 140 },
    {
      field: 'category',
      title: '器具类别',
      width: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_DV_METERING_CATEGORY },
      },
    },
    { field: 'specification', title: '规格型号', minWidth: 120 },
    { field: 'deptName', title: '使用部门', width: 120 },
    { field: 'chargeUserNickname', title: '责任人', width: 100 },
    {
      field: 'nextCheckDate',
      title: '下次检测日期',
      width: 120,
      formatter: 'formatDate',
    },
    {
      field: 'status',
      title: '器具状态',
      width: 90,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.MES_DV_METERING_STATUS },
      },
    },
  ];
}
