import type { NormalizedReportViewConfig, NormalizedReportViewTab, ReportViewConfig, ReportViewTab, ReportViewTabKey } from '../types';

const DEFAULT_TITLE = '查看报告';
const DEFAULT_TAB_TITLES: Record<ReportViewTab['key'], string> = {
  attachments: '附件',
  customPrint: '报告',
  formDetail: '表单详情',
};

export function validateReportViewConfig(config: Pick<ReportViewConfig, 'tabs'>) {
  if (!config.tabs?.length) {
    throw new Error('查看报告至少需要一个 tab');
  }
}

function isNormalizedTab(tab: ReportViewTab | NormalizedReportViewTab): tab is NormalizedReportViewTab {
  return 'internalKey' in tab;
}

function getTabActiveKey(tab: ReportViewTab | NormalizedReportViewTab) {
  return isNormalizedTab(tab) ? tab.internalKey : tab.key;
}

function isSameActiveKey(tab: ReportViewTab | NormalizedReportViewTab, activeKey: string) {
  if (getTabActiveKey(tab) === activeKey || tab.key === activeKey) return true;
  return tab.key === 'formDetail' && tab.id === activeKey;
}

export function getDefaultActiveKey(config: ReportViewConfig | NormalizedReportViewConfig) {
  validateReportViewConfig(config);

  if (config.activeKey) {
    const activeTab = config.tabs.find(tab => isSameActiveKey(tab, config.activeKey!));
    if (activeTab) return getTabActiveKey(activeTab);
  }

  const firstTab = config.tabs[0];
  return getTabActiveKey(firstTab!);
}

export function normalizeReportViewConfig(config: ReportViewConfig): NormalizedReportViewConfig {
  validateReportViewConfig(config);
  const tabs = config.tabs.map((tab, index) => ({
    ...tab,
    internalKey: `${tab.key}:${index}`,
    title: tab.title || DEFAULT_TAB_TITLES[tab.key],
  }));

  const normalizedConfig: NormalizedReportViewConfig = {
    ...config,
    tabs,
    title: config.title || DEFAULT_TITLE,
  };

  normalizedConfig.activeKey = getDefaultActiveKey(normalizedConfig);
  return normalizedConfig;
}

export function getReportViewHeaderMode(config: Pick<ReportViewConfig, 'actions'> | ReportViewConfig | NormalizedReportViewConfig) {
  return Array.isArray(config.actions) ? 'actions' : 'print';
}

export function hasCustomPrintTab(config: Pick<ReportViewConfig, 'tabs'>) {
  return config.tabs.some(tab => tab.key === 'customPrint');
}

export function shouldEnablePrintAction(config: Pick<ReportViewConfig, 'tabs'>, activeKey: ReportViewTabKey) {
  return activeKey === 'customPrint' && hasCustomPrintTab(config);
}
