import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { HrmAttendanceSummaryApi } from '#/api/hrm/attendance/summary';

import { getDeptList } from '#/api/system/dept';
import { handleTree } from '#/packages/utils/src';
import { getEmployeeSimpleList } from '#/api/hrm/employee';

/** 列表的搜索表单 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'yearMonth',
      label: '年月',
      component: 'DatePicker',
      componentProps: {
        picker: 'month',
        allowClear: true,
        valueFormat: 'YYYY-MM',
        format: 'YYYY-MM',
        style: { width: '100%' },
        placeholder: '选择年月',
      },
    },
    {
      fieldName: 'deptId',
      label: '部门',
      component: 'ApiTreeSelect',
      componentProps: {
        api: async () => {
          const data = await getDeptList();
          return handleTree(data);
        },
        labelField: 'name',
        valueField: 'id',
        childrenField: 'children',
        allowClear: true,
        placeholder: '请选择部门',
        treeDefaultExpandAll: true,
      },
    },
    {
      fieldName: 'userName',
      label: '员工姓名',
      component: 'Input',
      componentProps: {
        allowClear: true,
        placeholder: '请输入员工姓名',
      },
    },
  ];
}

/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions<HrmAttendanceSummaryApi.AttendanceSummary>['columns'] {
  return [
    { field: 'userName', title: '员工姓名', minWidth: 100 },
    { field: 'deptName', title: '部门', minWidth: 120 },
    { field: 'yearMonth', title: '年月', width: 100 },
    { field: 'workDays', title: '应出勤天数', width: 100 },
    { field: 'actualDays', title: '实际出勤天数', width: 110 },
    {
      field: 'lateCount',
      title: '迟到次数',
      width: 90,
      slots: {
        default: 'lateCount',
      },
    },
    {
      field: 'earlyCount',
      title: '早退次数',
      width: 90,
      slots: {
        default: 'earlyCount',
      },
    },
    {
      field: 'absentCount',
      title: '缺卡次数',
      width: 90,
      slots: {
        default: 'absentCount',
      },
    },
    { field: 'overtimeHours', title: '加班时长(h)', width: 100 },
    { field: 'leaveHours', title: '请假时长(h)', width: 100 },
  ];
}

/** 生成统计弹窗的表单 */
export function useGenerateFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'yearMonth',
      label: '年月',
      component: 'DatePicker',
      componentProps: {
        picker: 'month',
        valueFormat: 'YYYY-MM',
        format: 'YYYY-MM',
        style: { width: '100%' },
        placeholder: '选择年月',
      },
      rules: 'required',
    },
    {
      fieldName: 'rangeType',
      label: '生成范围',
      component: 'RadioGroup',
      componentProps: {
        options: [
          { label: '全公司', value: 'all' },
          { label: '指定部门', value: 'dept' },
          { label: '指定员工', value: 'user' },
        ],
      },
      defaultValue: 'all',
    },
    {
      fieldName: 'deptId',
      label: '部门',
      component: 'ApiTreeSelect',
      dependencies: {
        triggerFields: ['rangeType'],
        show: (values) => values.rangeType === 'dept',
        required: (values) => values.rangeType === 'dept',
      },
      componentProps: {
        api: async () => {
          const data = await getDeptList();
          return handleTree(data);
        },
        labelField: 'name',
        valueField: 'id',
        childrenField: 'children',
        placeholder: '选择部门',
        treeDefaultExpandAll: true,
      },
    },
    {
      fieldName: 'userId',
      label: '员工',
      component: 'ApiSelect',
      dependencies: {
        triggerFields: ['rangeType'],
        show: (values) => values.rangeType === 'user',
        required: (values) => values.rangeType === 'user',
      },
      componentProps: {
        api: async () => {
          const data = await getEmployeeSimpleList();
          return data;
        },
        labelField: 'name',
        valueField: 'id',
        placeholder: '选择员工',
        showSearch: true,
        filterOption: true,
      },
    },
  ];
}