import { IPublicTypeComponentMetadata, IPublicTypeSnippet } from '@alilc/lowcode-types';
import { YwButtonBaseProps } from '../_base';
import { getPropValueWithPath, getPropsByDependence, uuid } from '../_utils';

const confirmModalProps = [
  {
    name: 'componentProps',
    title: { label: '配置项', tip: 'componentProps | 配置项' },
    setter: {
      componentName: 'ObjectSetter',
      props: {
        config: {
          items: [
            {
              name: 'title',
              title: { label: '提示', tip: 'title | 提示' },
              setter: 'StringSetter',
              supportVariable: false,
              getValue: (_, v) => v || '提示',
            },
            {
              name: '_content',
              title: {
                label: '内容',
                tip: 'content | 提示内容 通过${this.record.xxxxx} 获取动态值',
              },
              isRequired: true,
              setter: {
                componentName: 'MixedSetter',
                props: {
                  setters: [
                    {
                      componentName: 'StringSetter',
                    },
                    {
                      componentName: 'VariableSetter',
                    },
                  ],
                },
              },
              extraProps: {
                getValue: (_, v) => v || '确认删除该数据吗？',
                setValue: (target, v) => {
                  const value = v.value || `'${v}'`;
                  target.parent.setPropValue('content', {
                    type: 'JSExpression',
                    value: `()=>${value}`,
                  });
                },
              },
            },
            {
              name: 'onOk',
              title: { label: '确认事件', tip: 'onOk | 确认事件' },
              setter: {
                componentName: 'MixedSetter',
                props: {
                  setters: [
                    {
                      componentName: 'SchemaFunctionSetter',
                      props: {
                        title: 'onOk',
                        async: true,
                        properties: {
                          input: {
                            type: 'object',
                            properties: {
                              value: {
                                type: 'object',
                              },
                              reload: {
                                type: 'object',
                              },
                            },
                            required: ['value', 'reload'],
                          },
                          body: {
                            type: 'array',
                            items: [
                              {
                                type: 'Function',
                                properties: {
                                  template: 'RequestFunction',
                                  variable: 'requestRes',
                                  extraProps: {
                                    params: {
                                      id: '{{value.id}}',
                                    },
                                    _params: false,
                                    _paramsArr: [
                                      {
                                        name: 'id',
                                        value: '{{value.id}}',
                                      },
                                    ],
                                  },
                                },
                              },
                              {
                                type: 'JSExpression',
                                run: 'if (requestRes) reload()',
                              },
                            ],
                          },
                        },
                      },
                    },
                    {
                      componentName: 'VariableSetter',
                    },
                  ],
                },
              },
            },
          ],
        },
      },
    },
  },
];

const buttonsProps = [
  ...YwButtonBaseProps,
  {
    name: 'disabeld',
    title: { label: '是否禁用', tip: 'disabeld | 是否禁用' },
    //   条件渲染setter 后面补充
    setter: 'BoolSetter',
  },
  {
    name: 'onClick',
    title: { label: '点击回调', tip: '点击按钮时的回调' },
    propType: 'func',
    setter: {
      componentName: 'FunctionSetter',
      props: {
        template: 'function (record,index,reload)=>{}',
      },
    },
  },
];

const historyProps = [
  {
    title: {
      label: '按钮文字',
      tip: 'btnText | 按钮文字',
    },
    name: 'btnText',
    description: '按钮文字',
    supportVariable: false,
    setter: {
      componentName: 'StringSetter',
      initialValue: '按钮',
    },
  },
  {
    title: {
      label: '跳转地址',
      tip: '_url | 跳转地址 如 /a/b/c, 查询参数用${record.xx}表示',
    },
    name: '_url',
    setter: {
      componentName: 'MixedSetter',
      props: {
        setters: [
          {
            componentName: 'StringSetter',
          },
          {
            componentName: 'VariableSetter',
          },
        ],
      },
    },
    extraProps: {
      getValue: (target, value) => value || '/',
      setValue: (target, v) => {
        const type = getPropValueWithPath(target, '.__optionType');
        const value = v.value || `'${v}'`;
        const func = {
          HistoryPush: `function (_,record){this.props.appHelper.history.push(${value})}`,
          HistoryOpen: `function(_,record){this.props.appHelper.history.open(${value})}`,
        };
        target.parent.setPropValue('onClick', {
          type: 'JSExpression',
          value: func[type],
        });
      },
    },
  },
];
const TableMultipleMeta: IPublicTypeComponentMetadata = {
  componentName: 'TableOperates',
  title: '操作列',
  docUrl: '',
  screenshot: '',
  devMode: 'proCode',
  group: '基础组件',
  category: '表格子元素',
  npm: {
    package: '@ywfe/materials-design',
    version: '0.1.0',
    exportName: 'TableOperates',
    main: 'src/index.tsx',
    destructuring: true,
    subName: '',
  },
  configure: {
    props: [
      {
        name: 'value',
        title: { label: '操作按钮配置', tip: '操作按钮配置' },
        setter: {
          componentName: 'ArraySetter',
          props: {
            itemSetter: {
              componentName: 'ObjectSetter',
              props: {
                descriptor: 'key',
                config: {
                  items: [
                    {
                      name: '__optionType',
                      title: { label: '操作类型', tip: '__optionType | 操作类型' },
                      setter: {
                        componentName: 'SelectSetter',
                        isRequired: true,
                        props: {
                          options: [
                            {
                              label: '普通按钮',
                              value: 'Button',
                            },
                            {
                              label: '页面跳转(当前页)',
                              value: 'HistoryPush',
                            },
                            {
                              label: '页面跳转(新开页面)',
                              value: 'HistoryOpen',
                            },
                            {
                              label: '查看数据(弹窗)',
                              value: 'DataDetailDialog',
                            },
                            {
                              label: '编辑数据(弹窗)',
                              value: 'DataEditDialog',
                            },
                            {
                              label: '删除数据',
                              value: 'ConfirmModal',
                            },
                            {
                              label: '自定义操作',
                              value: '',
                            },
                          ],
                        },
                      },
                      extraProps: {
                        setValue: (target, v) => {
                          switch (v) {
                            case 'ConfirmModal':
                              target.parent.setPropValue('type', 'danger');
                              target.parent.setPropValue('btnText', '删除');
                              target.parent.setPropValue('render', null);
                              target.parent.setPropValue('btnType', 'link');
                              target.parent.setPropValue('component', 'ConfirmModal');
                              break;
                            case 'HistoryPush':
                              target.parent.setPropValue('btnText', '查看详情');
                              target.parent.setPropValue('render', null);
                              target.parent.setPropValue('btnType', 'link');
                              break;
                            case 'HistoryOpen':
                              target.parent.setPropValue('btnText', '查看详情');
                              target.parent.setPropValue('render', null);
                              target.parent.setPropValue('btnType', 'link');
                              break;
                            case 'DataEditDialog':
                              target.parent.setPropValue('render', {
                                type: 'JSSlot',
                                params: ['initialValues', 'index', 'reload'],
                                value: [
                                  {
                                    componentName: 'DataEditDialog',
                                    id: `node_${uuid()}`,
                                    props: {
                                      btnText: '编辑',
                                      btnType: 'link',
                                      title: '编辑数据',
                                      reload: {
                                        type: 'JSExpression',
                                        value: 'this.reload',
                                      },
                                      initialValues: {
                                        type: 'JSExpression',
                                        value: 'this.initialValues',
                                      },
                                      items: [
                                        {
                                          component: 'Input',
                                          title: '表单项',
                                          name: `input_${uuid()}`,
                                        },
                                      ],
                                    },
                                  },
                                ],
                                id: `node_${uuid()}`,
                              });
                              break;
                            case 'DataDetailDialog':
                              target.parent.setPropValue('render', {
                                type: 'JSSlot',
                                params: ['initialValues', 'index', 'reload'],
                                value: [
                                  {
                                    componentName: 'DataEditDialog',
                                    id: `node_${uuid()}`,
                                    props: {
                                      btnText: '编辑',
                                      btnType: 'link',
                                      title: '编辑数据',
                                      reload: {
                                        type: 'JSExpression',
                                        value: 'this.reload',
                                      },
                                      initialValues: {
                                        type: 'JSExpression',
                                        value: 'this.initialValues',
                                      },
                                      items: [
                                        {
                                          component: 'Input',
                                          title: '表单项',
                                          name: `input_${uuid()}`,
                                        },
                                      ],
                                    },
                                  },
                                ],
                                id: `node_${uuid()}`,
                              });
                              break;
                            default:
                              break;
                          }
                        },
                      },
                    },
                    {
                      name: 'visible',
                      title: { label: '是否显示', tip: 'visible | 是否显示' },
                      setter: 'BoolSetter',
                    },
                    ...getPropsByDependence(confirmModalProps, ['ConfirmModal'], '.__optionType'),
                    ...getPropsByDependence(
                      historyProps,
                      ['HistoryPush', 'HistoryOpen'],
                      '.__optionType',
                    ),
                    ...getPropsByDependence(buttonsProps, ['Button'], '.__optionType'),
                    {
                      name: 'render',
                      title: {
                        label: '自定义操作',
                        tip: 'render | 自定义操作按钮',
                      },
                      propType: 'func',
                      setter: {
                        componentName: 'SlotSetter',
                        title: '自定义操作按钮',
                        props: {
                          hideParams: false,
                        },
                        initialValue: {
                          type: 'JSSlot',
                          hideParams: false,
                          supportParams: true,
                          params: ['initialValues', 'index', 'reload'],
                          value: [],
                        },
                      },
                      condition: (target: any) => !getPropValueWithPath(target, '.__optionType'),
                    },
                  ],
                },
              },
              initialValue: {
                render: {
                  type: 'JSSlot',
                  hideParams: false,
                  supportParams: true,
                  params: ['initialValues', 'index', 'reload'],
                  value: [],
                },
              },
            },
          },
        },
      },
    ],
    supports: {
      style: true,
      events: [
        {
          name: 'handeBatchClick', // 批量操作事件
          template: 'handeBatchClick(keys,data,reload){ console.log(keys);reload()}',
        },
        {
          name: 'handeActionClick', // 批量操作事件
          template: 'handeBatchClick(reload){ reload() }',
        },
      ],
    },
    component: {},
  },
};
const snippets: IPublicTypeSnippet[] = [
  {
    title: '操作列',
    screenshot: 'https://yw-fed-static.oss-cn-hangzhou.aliyuncs.com/lowcode/tableOpration',
    schema: {
      componentName: 'TableOperates',
      props: {
        record: {
          type: 'JSExpression',
          value: 'this.record',
        },
        index: {
          type: 'JSExpression',
          value: 'this.index',
        },
        tableRef: {
          type: 'JSExpression',
          value: 'this.tableRef',
        },
        reload: {
          type: 'JSExpression',
          value: 'this.tableRef.current.reload',
        },
        refresh: {
          type: 'JSExpression',
          value: 'this.tableRef.current.refresh',
        },
        value: [
          {
            render: {
              type: 'JSSlot',
              hideParams: false,
              supportParams: true,
              params: ['_', 'record', 'reload'],
              value: [],
            },
          },
        ],
      },
    },
  },
];

export default {
  ...TableMultipleMeta,
  snippets,
};
