import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { HrmOvertimeApi } from '#/api/hrm/overtime';

import { DICT_TYPE } from '#/packages/constants/src';
import { getDictOptions } from '#/packages/effects/hooks/src';

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

export const OVERTIME_TYPE_OPTIONS = [
  { label: '工作日加班', value: 1 },
  { label: '休息日加班', value: 2 },
  { label: '法定节假日加班', value: 3 },
];

export const RELATED_TYPE_OPTIONS = [
  { label: '项目', value: 1 },
  { label: '工单', value: 2 },
];

export function getOvertimeTypeLabel(type?: number) {
  return OVERTIME_TYPE_OPTIONS.find((item) => item.value === type)?.label || '-';
}

/** 新增/修改加班申请的表单 */
export function useFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'id',
      component: 'Input',
      dependencies: { triggerFields: [''], show: () => false },
    },
    {
      fieldName: 'employeeId',
      component: 'Input',
      dependencies: { triggerFields: [''], show: () => false },
    },
    {
      fieldName: 'baseInfoDivider',
      label: '申请人基础信息',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'employeeName',
      label: '申请人',
      component: 'Input',
      componentProps: { disabled: true, placeholder: '系统自动带出' },
    },
    {
      fieldName: 'employeeNo',
      label: '工号',
      component: 'Input',
      componentProps: { disabled: true, placeholder: '系统自动带出' },
    },
    {
      fieldName: 'deptName',
      label: '所属部门',
      component: 'Input',
      componentProps: { disabled: true, placeholder: '系统自动带出' },
    },
    {
      fieldName: 'postName',
      label: '岗位/职级',
      component: 'Input',
      componentProps: { disabled: true, placeholder: '系统自动带出' },
    },
    {
      fieldName: 'overtimeInfoDivider',
      label: '加班核心信息',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'overtimeDate',
      label: '加班日期',
      component: 'DatePicker',
      componentProps: {
        placeholder: '请选择加班日期',
        valueFormat: 'YYYY-MM-DD',
        style: { width: '100%' },
      },
      rules: 'required',
    },
    {
      fieldName: 'overtimeType',
      label: '加班类型',
      component: 'Select',
      componentProps: {
        options: OVERTIME_TYPE_OPTIONS,
        placeholder: '请选择加班类型',
      },
      help: '不同类型对应不同的薪资计算规则',
      rules: 'selectRequired',
    },
    {
      fieldName: 'startTime',
      label: '开始时间',
      component: 'TimePicker',
      componentProps: {
        format: 'HH:mm',
        minuteStep: 30,
        placeholder: '请选择开始时间',
        valueFormat: 'HH:mm:ss',
        style: { width: '100%' },
      },
      rules: 'required',
    },
    {
      fieldName: 'endTime',
      label: '结束时间',
      component: 'TimePicker',
      componentProps: {
        format: 'HH:mm',
        minuteStep: 30,
        placeholder: '请选择结束时间',
        valueFormat: 'HH:mm:ss',
        style: { width: '100%' },
      },
      rules: 'required',
    },
    {
      fieldName: 'crossDay',
      label: '是否跨天',
      component: 'Switch',
      componentProps: {
        checkedChildren: '是',
        disabled: true,
        unCheckedChildren: '否',
      },
      defaultValue: false,
      help: '结束时间早于或等于开始时间时，系统自动标记为跨天',
    },
    {
      fieldName: 'mealDeduction',
      label: '扣除用餐时间',
      component: 'Switch',
      componentProps: {
        checkedChildren: '扣除',
        unCheckedChildren: '不扣除',
      },
      defaultValue: false,
    },
    {
      fieldName: 'mealDeductionHours',
      label: '用餐扣除时长',
      component: 'InputNumber',
      componentProps: {
        min: 0.5,
        max: 4,
        precision: 1,
        step: 0.5,
        style: { width: '100%' },
      },
      defaultValue: 1,
      suffix: '小时',
      dependencies: {
        triggerFields: ['mealDeduction'],
        show: (values) => Boolean(values.mealDeduction),
      },
    },
    {
      fieldName: 'duration',
      label: '加班时长',
      component: 'InputNumber',
      componentProps: {
        disabled: true,
        min: 0,
        precision: 1,
        step: 0.5,
        style: { width: '100%' },
      },
      help: '按实际时段扣除用餐时间后，自动取整到 0.5 小时',
      suffix: '小时',
      rules: 'required',
    },
    {
      fieldName: 'reasonInfoDivider',
      label: '加班事由',
      component: 'Divider',
      formItemClass: 'col-span-2',
    },
    {
      fieldName: 'reason',
      label: '加班原因',
      component: 'Textarea',
      formItemClass: 'col-span-2',
      componentProps: {
        maxlength: 500,
        placeholder: '请说明加班的必要性和原因',
        rows: 3,
        showCount: true,
      },
      rules: 'required',
    },
    {
      fieldName: 'relatedType',
      label: '关联类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: RELATED_TYPE_OPTIONS,
        placeholder: '可选：项目或工单',
      },
    },
    {
      fieldName: 'relatedCode',
      label: '项目/工单编号',
      component: 'Input',
      componentProps: {
        allowClear: true,
        maxlength: 100,
        placeholder: '请输入关联项目或工单编号',
      },
      dependencies: {
        triggerFields: ['relatedType'],
        componentProps: (values) => ({
          allowClear: true,
          maxlength: 100,
          placeholder: values.relatedType === 1
            ? '请输入项目编号'
            : values.relatedType === 2
              ? '请输入工单编号'
              : '请先选择关联类型',
          disabled: !values.relatedType,
        }),
      },
    },
    {
      fieldName: 'workContent',
      label: '工作内容简述',
      component: 'Textarea',
      formItemClass: 'col-span-2',
      componentProps: {
        maxlength: 1000,
        placeholder: '请简要描述加班期间计划完成的具体工作',
        rows: 4,
        showCount: true,
      },
    },
  ];
}

/** 列表搜索表单 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'overtimeDate',
      label: '加班日期',
      component: 'DatePicker',
      componentProps: {
        allowClear: true,
        placeholder: '请选择加班日期',
        valueFormat: 'YYYY-MM-DD',
      },
    },
    {
      fieldName: 'overtimeType',
      label: '加班类型',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: OVERTIME_TYPE_OPTIONS,
        placeholder: '请选择加班类型',
      },
    },
    {
      fieldName: 'status',
      label: '审批状态',
      component: 'Select',
      componentProps: {
        allowClear: true,
        options: getDictOptions(DICT_TYPE.HRM_AUDIT_STATUS, 'number'),
        placeholder: '请选择审批状态',
      },
    },
  ];
}

/** 列表字段 */
export function useGridColumns(): VxeTableGridOptions<HrmOvertimeApi.Overtime>['columns'] {
  return [
    { field: 'id', title: '申请编号', width: 90 },
    { field: 'employeeName', title: '申请人', minWidth: 100 },
    { field: 'employeeNo', title: '工号', minWidth: 110 },
    { field: 'deptName', title: '所属部门', minWidth: 120 },
    { field: 'overtimeDate', title: '加班日期', width: 120 },
    {
      field: 'overtimeType',
      title: '加班类型',
      width: 130,
      slots: { default: 'overtimeType' },
    },
    { field: 'startTime', title: '开始时间', width: 100 },
    { field: 'endTime', title: '结束时间', width: 100 },
    { field: 'duration', title: '时长(小时)', width: 100 },
    {
      field: 'status',
      title: '审批状态',
      width: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.HRM_AUDIT_STATUS },
      },
    },
    {
      field: 'createTime',
      title: '创建时间',
      width: 180,
      formatter: 'formatDateTime',
    },
    {
      title: '操作',
      width: 200,
      fixed: 'right',
      slots: { default: 'actions' },
    },
  ];
}
