import { ISchema } from '@formily/react';
import { uid } from '@formily/shared';
import { lang } from '../../locale';

const getArraySchema = (fields = {}, extra = {}) => ({
  type: 'array',
  'x-decorator': 'FormItem',
  'x-component': 'ArrayItems',
  ...extra,
  items: {
    type: 'object',
    properties: {
      space: {
        type: 'void',
        'x-component': 'Space',
        properties: {
          sort: {
            type: 'void',
            'x-decorator': 'FormItem',
            'x-component': 'ArrayItems.SortHandle',
          },
          ...fields,
          remove: {
            type: 'void',
            'x-decorator': 'FormItem',
            'x-component': 'ArrayItems.Remove',
          },
        },
      },
    },
  },
  properties: {
    add: {
      type: 'void',
      title: '{{t("Add field")}}',
      'x-component': 'ArrayItems.Addition',
    },
  },
});

export const getConfigSchema = (general: any): ISchema => ({
  type: 'void',
  properties: {
    config: {
      type: 'object',
      properties: {
        chartType: {
          type: 'string',
          title: '{{t("Chart type")}}',
          'x-decorator': 'FormItem',
          'x-component': 'Select',
          'x-component-props': {
            placeholder: '{{t("Please select a chart type.")}}',
          },
          enum: '{{ chartTypes }}',
        },
        [uid()]: {
          type: 'void',
          properties: {
            general,
          },
        },
        [uid()]: {
          type: 'void',
          properties: {
            advanced: {
              type: 'json',
              title: '{{t("JSON config")}}',
              'x-decorator': 'FormItem',
              'x-decorator-props': {
                extra: lang('Same properties set in the form above will be overwritten by this JSON config.'),
              },
              'x-component': 'Input.JSON',
              'x-component-props': {
                autoSize: {
                  minRows: 3,
                },
              },
            },
          },
        },
        reference: {
          type: 'string',
          'x-reactions': {
            dependencies: ['.chartType'],
            fulfill: {
              schema: {
                'x-content': '{{ getReference($deps[0]) }}',
              },
            },
          },
        },
      },
    },
  },
});

export const querySchema: ISchema = {
  type: 'void',
  properties: {
    settings: {
      type: 'void',
      // 'x-component': 'FormItem',
      properties: {
        // mode: {
        //   type: 'string',
        //   'x-decorator': 'FormItem',
        //   'x-decorator-props': {
        //     style: {
        //       display: 'inline-block',
        //       width: '45%',
        //     },
        //   },
        //   'x-component': 'Radio.Group',
        //   'x-component-props': {
        //     defaultValue: 'builder',
        //     optionType: 'button',
        //     buttonStyle: 'solid',
        //   },
        //   enum: [
        //     {
        //       label: lang('Builder mode'),
        //       value: 'builder',
        //     },
        //     {
        //       label: lang('SQL mode'),
        //       value: 'sql',
        //     },
        //   ],
        //   'x-reactions': [
        //     {
        //       target: 'query.builder',
        //       fulfill: {
        //         state: {
        //           visible: '{{ $self.value !== "sql" }}',
        //         },
        //       },
        //     },
        //     {
        //       target: 'query.sql',
        //       fulfill: {
        //         state: {
        //           visible: '{{ $self.value === "sql" }}',
        //         },
        //       },
        //     },
        //   ],
        // },
        collection: {
          title: '{{t("Collection")}}',
          type: 'string',
          'x-decorator': 'FormItem',
          'x-component': 'Cascader',
          enum: '{{ collectionOptions }}',
          'x-component-props': {
            onChange: '{{ onCollectionChange }}',
            placeholder: '{{t("Collection")}}',
          },
        },
      },
    },
    query: {
      type: 'object',
      properties: {
        builder: {
          type: 'void',
          properties: {
            collapse: {
              type: 'void',
              'x-decorator': 'FormItem',
              'x-component': 'FormCollapse',
              'x-component-props': {
                formCollapse: '{{formCollapse}}',
              },
              properties: {
                pane1: {
                  type: 'void',
                  'x-component': 'FormCollapse.CollapsePanel',
                  'x-component-props': {
                    header: lang('Measures'),
                    key: 'measures',
                  },
                  properties: {
                    measures: getArraySchema(
                      {
                        field: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Cascader',
                          'x-component-props': {
                            placeholder: '{{t("Field")}}',
                            fieldNames: {
                              label: 'title',
                              value: 'name',
                              children: 'children',
                            },
                          },
                          enum: '{{ fieldOptions }}',
                          required: true,
                        },
                        aggregation: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Select',
                          'x-component-props': {
                            placeholder: '{{t("Aggregation")}}',
                          },
                          enum: [
                            { label: '{{t("Sum")}}', value: 'sum' },
                            { label: '{{t("Count")}}', value: 'count' },
                            { label: '{{t("Avg")}}', value: 'avg' },
                            { label: '{{t("Max")}}', value: 'max' },
                            { label: '{{t("Min")}}', value: 'min' },
                            { label: 'array_agg', value: 'array_agg' },
                          ],
                        },
                        alias: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Input',
                          'x-component-props': {
                            placeholder: '{{t("Alias")}}',
                            style: {
                              minWidth: '100px',
                            },
                          },
                        },
                      },
                      {
                        required: true,
                        'x-component-props': {
                          style: {
                            overflow: 'auto',
                          },
                        },
                      },
                    ),
                  },
                },
                pane2: {
                  type: 'void',
                  'x-component': 'FormCollapse.CollapsePanel',
                  'x-component-props': {
                    header: lang('Dimensions'),
                    key: 'dimensions',
                  },
                  properties: {
                    dimensions: getArraySchema(
                      {
                        field: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Cascader',
                          'x-component-props': {
                            placeholder: '{{t("Field")}}',
                            fieldNames: {
                              label: 'title',
                              value: 'name',
                              children: 'children',
                            },
                          },
                          enum: '{{ fieldOptions }}',
                          required: true,
                        },
                        format: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Select',
                          'x-component-props': {
                            placeholder: '{{t("Format")}}',
                            style: {
                              maxWidth: '120px',
                            },
                          },
                          'x-reactions': '{{ useFormatterOptions }}',
                          'x-visible': '{{ $self.dataSource && $self.dataSource.length }}',
                        },
                        alias: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Input',
                          'x-component-props': {
                            placeholder: '{{t("Alias")}}',
                            style: {
                              minWidth: '100px',
                            },
                          },
                        },
                      },
                      {
                        'x-component-props': {
                          style: {
                            overflow: 'auto',
                          },
                        },
                      },
                    ),
                  },
                },
                pane3: {
                  type: 'void',
                  'x-component': 'FormCollapse.CollapsePanel',
                  'x-component-props': {
                    header: lang('Filter'),
                    key: 'filter',
                  },
                  properties: {
                    filter: {
                      type: 'object',
                      'x-decorator': 'FormItem',
                      'x-decorator-props': {
                        style: {
                          overflow: 'auto',
                        },
                      },
                      enum: '{{ filterOptions }}',
                      'x-component': 'Filter',
                      'x-component-props': {
                        dynamicComponent: 'FilterDynamicComponent',
                      },
                    },
                  },
                },
                pane4: {
                  type: 'void',
                  'x-component': 'FormCollapse.CollapsePanel',
                  'x-component-props': {
                    header: lang('Sort'),
                    key: 'sort',
                  },
                  properties: {
                    orders: getArraySchema(
                      {
                        field: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Cascader',
                          'x-component-props': {
                            placeholder: '{{t("Field")}}',
                          },
                          'x-reactions': '{{ useOrderOptions }}',
                          required: true,
                        },
                        order: {
                          type: 'string',
                          'x-decorator': 'FormItem',
                          'x-component': 'Radio.Group',
                          'x-component-props': {
                            defaultValue: 'ASC',
                            optionType: 'button',
                            style: {
                              width: '128px',
                            },
                          },
                          enum: ['ASC', 'DESC'],
                        },
                      },
                      {
                        'x-reactions': '{{ useOrderReaction }}',
                        'x-component-props': {
                          style: {
                            overflow: 'auto',
                          },
                        },
                      },
                    ),
                  },
                },
              },
            },
            limit: {
              title: '{{t("Limit")}}',
              type: 'number',
              'x-decorator': 'FormItem',
              'x-component': 'InputNumber',
              'x-component-props': {
                defaultValue: 2000,
                min: 1,
                style: {
                  width: '100px',
                },
              },
            },
          },
        },
        // sql: {
        //   type: 'object',
        //   properties: {
        //     select: {
        //       type: 'void',
        //       'x-decorator': 'p',
        //       'x-component': 'Text',
        //       'x-component-props': {
        //         code: true,
        //       },
        //       'x-content': 'SELECT',
        //     },
        //     fields: {
        //       type: 'string',
        //       'x-decorator': 'FormItem',
        //       'x-component': 'Input.TextArea',
        //       'x-component-props': {
        //         autoSize: {
        //           minRows: 2,
        //         },
        //         placeholder: 'Fields',
        //       },
        //       required: true,
        //     },
        //     from: {
        //       type: 'void',
        //       'x-decorator': 'p',
        //       'x-component': 'FromSql',
        //     },
        //     clauses: {
        //       type: 'string',
        //       'x-decorator': 'FormItem',
        //       'x-component': 'Input.TextArea',
        //       'x-component-props': {
        //         autoSize: {
        //           minRows: 5,
        //         },
        //         placeholder: 'Join, Where, Group By, Having, Order By, Limit',
        //       },
        //       required: true,
        //     },
        //   },
        // },
        cache: {
          type: 'object',
          properties: {
            enabled: {
              type: 'boolean',
              title: '{{t("Enable cache")}}',
              'x-decorator': 'FormItem',
              'x-component': 'Switch',
            },
            ttl: {
              type: 'number',
              title: '{{t("TTL (second)")}}',
              'x-decorator': 'FormItem',
              'x-component': 'InputNumber',
              'x-component-props': {
                defaultValue: 60,
                min: 1,
                style: {
                  width: '100px',
                },
              },
            },
          },
        },
      },
    },
  },
};

export const transformSchema: ISchema = {
  type: 'void',
  properties: {
    transform: getArraySchema(
      {
        field: {
          type: 'string',
          'x-decorator': 'FormItem',
          'x-component': 'Select',
          'x-component-props': {
            placeholder: '{{t("Field")}}',
            style: {
              maxWidth: '100px',
            },
          },
          'x-reactions': '{{ useChartFields }}',
        },
        type: {
          type: 'string',
          'x-decorator': 'FormItem',
          'x-component': 'Select',
          'x-component-props': {
            placeholder: '{{t("Type")}}',
          },
          'x-reactions': '{{ useFieldTypeOptions }}',
        },
        format: {
          type: 'string',
          'x-decorator': 'FormItem',
          'x-component': 'Select',
          'x-component-props': {
            placeholder: '{{t("Format")}}',
          },
          'x-reactions': '{{ useTransformers }}',
          'x-visible': '{{ $self.dataSource && $self.dataSource.length }}',
        },
        specific: {
          type: 'string',
          'x-decorator': 'FormItem',
          'x-component': 'Select',
          'x-component-props': {
            placeholder: '{{t("Format")}}',
          },
          'x-reactions': '{{ useTransformersDecimal }}',
          'x-visible': '{{ $self.dataSource && $self.dataSource.length }}',
        },
      },
      {
        'x-decorator-props': {
          style: {
            width: '50%',
          },
        },
      },
    ),
  },
};
