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

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

import { getSimpleDeptList } from '#/api/system/dept';
import { getSimpleUserList } from '#/api/system/user';
import { MdmItemSelect } from '#/views/basicData/mdm/components';

import { markRaw } from 'vue';

/** 目标维度枚举 */
export const SALES_TARGET_DIMENSION = {
  USER: 1, // 个人
  DEPT: 2, // 部门
  ITEM: 3, // 产品
} as const;

/** 周期类型枚举 */
export const SALES_TARGET_PERIOD_TYPE = {
  YEAR: 1, // 年
  QUARTER: 2, // 季度
  MONTH: 3, // 月
} as const;

/** 周期值输入占位提示 */
const PERIOD_VALUE_PLACEHOLDER: Record<number, string> = {
  [SALES_TARGET_PERIOD_TYPE.YEAR]: '请输入年份，如 2026',
  [SALES_TARGET_PERIOD_TYPE.QUARTER]: '请输入季度，如 2026-Q1',
  [SALES_TARGET_PERIOD_TYPE.MONTH]: '请输入月份，如 2026-07',
};

/** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'id',
      component: 'Input',
      dependencies: {
        triggerFields: [''],
        show: () => false,
      },
    },
    {
      fieldName: 'name',
      label: '目标名称',
      component: 'Input',
      rules: 'required',
      componentProps: {
        placeholder: '请输入目标名称，如 2026 年度销售目标',
        allowClear: true,
      },
    },
    {
      fieldName: 'periodType',
      label: '周期类型',
      component: 'Select',
      rules: 'required',
      componentProps: {
        options: getDictOptions(DICT_TYPE.CRM_SALES_TARGET_PERIOD_TYPE, 'number'),
        placeholder: '请选择周期类型',
      },
    },
    {
      fieldName: 'periodValue',
      label: '周期值',
      component: 'Input',
      rules: 'required',
      dependencies: {
        triggerFields: ['periodType'],
        async componentProps(values) {
          const placeholder =
            PERIOD_VALUE_PLACEHOLDER[values.periodType] ?? '请输入周期值';
          return { placeholder };
        },
      },
    },
    {
      fieldName: 'targetDimension',
      label: '目标维度',
      component: 'Select',
      rules: 'required',
      componentProps: (_values, form) => ({
        options: getDictOptions(DICT_TYPE.CRM_SALES_TARGET_DIMENSION, 'number'),
        placeholder: '请选择目标维度',
        onChange: () => {
          form.setFieldValue('targetUserId', undefined);
          form.setFieldValue('targetDeptId', undefined);
          form.setFieldValue('targetItemId', undefined);
        },
      }),
    },
    {
      fieldName: 'targetUserId',
      label: '目标用户',
      component: 'ApiSelect',
      componentProps: {
        api: getSimpleUserList,
        labelField: 'nickname',
        valueField: 'id',
        placeholder: '请选择目标用户',
        allowClear: true,
      },
      dependencies: {
        triggerFields: ['targetDimension'],
        show: (values) => values.targetDimension === SALES_TARGET_DIMENSION.USER,
      },
    },
    {
      fieldName: 'targetDeptId',
      label: '目标部门',
      component: 'ApiTreeSelect',
      componentProps: {
        api: async () => {
          const data = await getSimpleDeptList();
          return handleTree(data);
        },
        labelField: 'name',
        valueField: 'id',
        childrenField: 'children',
        treeDefaultExpandAll: true,
        placeholder: '请选择目标部门',
        allowClear: true,
      },
      dependencies: {
        triggerFields: ['targetDimension'],
        show: (values) => values.targetDimension === SALES_TARGET_DIMENSION.DEPT,
      },
    },
    {
      fieldName: 'targetItemId',
      label: '目标产品',
      component: markRaw(MdmItemSelect),
      componentProps: {
        placeholder: '请选择目标产品',
      },
      dependencies: {
        triggerFields: ['targetDimension'],
        show: (values) => values.targetDimension === SALES_TARGET_DIMENSION.ITEM,
      },
    },
    {
      fieldName: 'contractTarget',
      label: '合同金额目标（元）',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 0,
        precision: 2,
        placeholder: '请输入合同金额目标',
      },
    },
    {
      fieldName: 'receivableTarget',
      label: '回款金额目标（元）',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 0,
        precision: 2,
        placeholder: '请输入回款金额目标',
      },
    },
    {
      fieldName: 'businessTarget',
      label: '商机金额目标（元）',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 0,
        precision: 2,
        placeholder: '请输入商机金额目标',
      },
    },
    {
      fieldName: 'customerTarget',
      label: '新增客户数目标',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 0,
        precision: 0,
        placeholder: '请输入新增客户数目标',
      },
    },
    {
      fieldName: 'contractCountTarget',
      label: '新增合同数目标',
      component: 'InputNumber',
      componentProps: {
        class: '!w-full',
        min: 0,
        precision: 0,
        placeholder: '请输入新增合同数目标',
      },
    },
    {
      fieldName: 'remark',
      label: '备注',
      component: 'Textarea',
      componentProps: {
        placeholder: '请输入备注',
        rows: 3,
      },
    },
  ];
}

/** 列表的搜索表单 */
export function useGridFormSchema(): VbenFormSchema[] {
  return [
    {
      fieldName: 'name',
      label: '目标名称',
      component: 'Input',
      componentProps: {
        placeholder: '请输入目标名称',
        allowClear: true,
      },
    },
    {
      fieldName: 'periodType',
      label: '周期类型',
      component: 'Select',
      componentProps: {
        options: getDictOptions(DICT_TYPE.CRM_SALES_TARGET_PERIOD_TYPE, 'number'),
        placeholder: '请选择周期类型',
        allowClear: true,
      },
    },
    {
      fieldName: 'periodValue',
      label: '周期值',
      component: 'Input',
      componentProps: {
        placeholder: '如 2026 / 2026-Q1 / 2026-07',
        allowClear: true,
      },
    },
    {
      fieldName: 'targetDimension',
      label: '目标维度',
      component: 'Select',
      componentProps: {
        options: getDictOptions(DICT_TYPE.CRM_SALES_TARGET_DIMENSION, 'number'),
        placeholder: '请选择目标维度',
        allowClear: true,
      },
    },
    {
      fieldName: 'status',
      label: '状态',
      component: 'Select',
      componentProps: {
        options: getDictOptions(DICT_TYPE.CRM_SALES_TARGET_STATUS, 'number'),
        placeholder: '请选择状态',
        allowClear: true,
      },
    },
  ];
}

/** 列表的字段 */
export function useGridColumns(): VxeTableGridOptions['columns'] {
  return [
    {
      field: 'name',
      title: '目标名称',
      minWidth: 200,
      fixed: 'left',
    },
    {
      field: 'periodType',
      title: '周期类型',
      minWidth: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.CRM_SALES_TARGET_PERIOD_TYPE },
      },
    },
    {
      field: 'periodValue',
      title: '周期值',
      minWidth: 120,
    },
    {
      field: 'targetUserName',
      title: '目标对象',
      minWidth: 160,
      slots: { default: 'target' },
    },
    {
      field: 'contractTarget',
      title: '合同金额',
      minWidth: 200,
      slots: { default: 'contract' },
    },
    {
      field: 'receivableTarget',
      title: '回款金额',
      minWidth: 200,
      slots: { default: 'receivable' },
    },
    {
      field: 'businessTarget',
      title: '商机金额',
      minWidth: 200,
      slots: { default: 'business' },
    },
    {
      field: 'customerTarget',
      title: '新增客户',
      minWidth: 170,
      slots: { default: 'customer' },
    },
    {
      field: 'contractCountTarget',
      title: '新增合同',
      minWidth: 170,
      slots: { default: 'contractCount' },
    },
    {
      field: 'status',
      title: '状态',
      minWidth: 100,
      cellRender: {
        name: 'CellDict',
        props: { type: DICT_TYPE.CRM_SALES_TARGET_STATUS },
      },
    },
    {
      field: 'createTime',
      title: '创建时间',
      minWidth: 160,
      formatter: 'formatDateTime',
    },
    {
      field: 'creatorName',
      title: '创建人',
      minWidth: 120,
    },
    {
      title: '操作',
      width: 180,
      fixed: 'right',
      slots: { default: 'actions' },
    },
  ];
}
