import { PFormProps, PGridProps } from '#/antProxy';
import type { AutoViewportBoxOffsetInput } from '@/utils/autoViewportBox';
import { ConfigType } from 'e-virt-table';
import { clone } from 'xe-utils';
import type { VNode } from 'vue';

// 全局配置接口
export interface UIKitConfig {
  form?: {
    labelCol?: any;
    wrapperCol?: any;
  };
  grid?: {
    align?: 'left' | 'right' | 'center';
    lazyReset?: boolean;
    fitHeight?: number;
    fitCanvasHeight?: number;
    striped?: boolean;
    /** `PGrid` / `PCanvasGrid` 分页是否显示「跳至」；`pageConfig.showQuickJumper` 优先 */
    showQuickJumper?: boolean;
    /** `PGrid` 开启 `autoBoxSize` 且未传 `autoBoxSizeOffset` 时的视口边距，与 props 类型一致 */
    autoBoxSizeOffset?: AutoViewportBoxOffsetInput;
  };
  canvasTable?: ConfigType;
  /**
   * 自定义 tooltip 渲染函数，替换全局所有 a-tooltip。
   * @param defaultSlot 原 tooltip 触发元素（图标等）
   * @param content tooltip 内容，字符串或返回 VNode 的函数
   */
  renderTooltip?: (defaultSlot: () => VNode, content: string | (() => VNode)) => VNode;
  /**
   * 自定义图标：按 `icon` 名字渲染；返回值为真时优先于 `@ant-design/icons-vue` 同名组件。
   */
  icon?: {
    render?: (name: string) => unknown;
    /**
     * CollapseCard / PFormGroup 折叠箭头：
     * - `string`：单图标，靠旋转区分（默认收起 0° / 展开 -90°）
     * - `[collapsed, expanded]`：双图标切换，不旋转
     */
    collapseExpandIcon?: string | [collapsed: string, expanded: string];
  };
}

// 默认配置
const defaultConfig: UIKitConfig = {
  form: {
    labelCol: { span: 6 },
    wrapperCol: { span: 16 },
  },
  grid: {
    align: 'left',
    lazyReset: false,
    fitHeight: 30,
    striped: false,
    showQuickJumper: true,
  },
  canvasTable: {
    DISABLED: true,
    ENABLE_FINDER: true,
    AUTO_ROW_HEIGHT: true,
    BORDER_RADIUS: 4,
  },
  icon: {},
};

// 当前配置（可被修改）
let currentConfig: UIKitConfig = clone(defaultConfig, true);

// 设置配置
export function setUIKitConfig(config: Partial<UIKitConfig>): void {
  currentConfig = {
    form: {
      ...currentConfig.form,
      ...config.form,
    },
    grid: {
      ...currentConfig.grid,
      ...config.grid,
    },
    canvasTable: {
      ...currentConfig.canvasTable,
      ...config.canvasTable,
    },
    renderTooltip: config.renderTooltip ?? currentConfig.renderTooltip,
    icon: {
      ...currentConfig.icon,
      ...config.icon,
    },
  };
}

// 获取自定义 tooltip 渲染函数
export function getTooltipRenderer(): UIKitConfig['renderTooltip'] {
  return currentConfig.renderTooltip;
}

// 获取配置
export function getUIKitConfig(): UIKitConfig {
  return currentConfig;
}

// 获取表单默认配置
export function getFormDefaults(): Partial<PFormProps> {
  return {
    labelCol: currentConfig.form?.labelCol,
    wrapperCol: currentConfig.form?.wrapperCol,
  };
}

// 获取Grid默认配置
export function getGridDefaults(): Partial<PGridProps> {
  return {
    align: currentConfig.grid?.align,
    lazyReset: currentConfig.grid?.lazyReset,
    fitHeight: currentConfig.grid?.fitHeight,
    striped: currentConfig.grid?.striped,
    autoBoxSizeOffset: currentConfig.grid?.autoBoxSizeOffset,
  };
}

/** 分页「跳至」：局部 pageConfig 优先，否则读全局 grid.showQuickJumper，默认 true */
export function resolveShowQuickJumper(pageConfig?: { showQuickJumper?: boolean }): boolean {
  if (pageConfig?.showQuickJumper !== undefined) {
    return pageConfig.showQuickJumper;
  }
  return currentConfig.grid?.showQuickJumper ?? true;
}

// 获取CanvasTable默认配置
export function getCanvasTableDefaults(): ConfigType {
  return currentConfig.canvasTable || ({} as ConfigType);
}

// 重置为默认配置
export function resetUIKitConfig(): void {
  currentConfig = JSON.parse(JSON.stringify(defaultConfig));
}
