import type { VxeGridProps } from '#/adapter/vxe-table';

import type { ShadowCompareRow } from '../api';

import { getShadowList } from '../api';
import { shadowSceneLabel } from './constants';
import { normalizeShadowFilters } from './search';

/**
 * 影子流量对比表格配置（只读，无操作列）
 *
 * 用工厂函数而不是直接导出 gridOptions：
 * 顶部统计看板要与列表用同一套筛选条件（诊所/场景/时间范围），
 * 每次 Grid 发起查询时通过 onQueried 回调把归一化后的参数抛给页面，
 * 页面据此同步刷新 getShadowStats——单一数据源，避免两套筛选状态漂移
 */
export function createGridOptions(
  onQueried?: (params: Record<string, any>) => void,
): VxeGridProps<ShadowCompareRow> {
  return {
    columnConfig: {
      useKey: true,
    },
    rowConfig: {
      useKey: true,
    },
    columns: [
      { field: 'id', align: 'left', title: 'ID', width: 80 },
      {
        field: 'scene',
        align: 'left',
        title: '场景',
        width: 90,
        formatter: ({ cellValue }) => shadowSceneLabel(String(cellValue)),
      },
      { field: 'store_id', align: 'left', title: '门店ID', width: 90 },
      {
        title: '主链路（PHP 直连）',
        align: 'center',
        children: [
          { field: 'primary_provider', align: 'left', title: 'Provider', width: 100 },
          { field: 'primary_tokens', align: 'right', title: 'Token', width: 90 },
          { field: 'primary_duration_ms', align: 'right', title: '耗时(ms)', width: 100 },
          {
            field: 'primary_status',
            align: 'left',
            title: '状态',
            width: 90,
            slots: { default: 'primary_status' },
          },
        ],
      },
      {
        title: '影子链路（Go Agent）',
        align: 'center',
        children: [
          { field: 'shadow_provider', align: 'left', title: 'Provider', width: 100 },
          { field: 'shadow_tokens', align: 'right', title: 'Token', width: 90 },
          { field: 'shadow_duration_ms', align: 'right', title: '耗时(ms)', width: 100 },
          {
            field: 'shadow_status',
            align: 'left',
            title: '状态',
            width: 90,
            slots: { default: 'shadow_status' },
          },
        ],
      },
      {
        field: 'content_similarity',
        align: 'right',
        title: '内容相似度',
        width: 110,
        slots: { default: 'similarity' },
      },
      { field: 'remark', align: 'left', title: '备注', minWidth: 160, showOverflow: true },
      { field: 'created_at', align: 'left', title: '对比时间', width: 170 },
    ],
    keepSource: true,
    pagerConfig: {},
    proxyConfig: {
      ajax: {
        query: async ({ page }, formValues) => {
          const filters = normalizeShadowFilters(formValues || {});
          // 统计看板与列表同步刷新（同一套筛选条件）
          onQueried?.(filters);
          const res = await getShadowList({
            page: page.currentPage,
            size: page.pageSize,
            ...filters,
          });
          // 后端返回 {list,total,page,size}，适配器约定 {items,total}
          return {
            items: (res as any)?.list ?? [],
            total: (res as any)?.total ?? 0,
          };
        },
      },
    },
    height: 'auto',
    border: false,
    toolbarConfig: {
      search: true,
      refresh: true,
      print: false,
      export: false,
      zoom: true,
      custom: {
        icon: 'vxe-icon-menu',
      },
    },
    showOverflow: true,
  };
}
