import { request, type ApiResponse } from './request'
import type { PersistedTestRecord, TestLogicStepMapping } from './tests'
import type { CompareMetricKey } from '@/stores/compareReports'

export interface CompareReportSummary {
  id: number
  name: string
  creator: string
  createdAt: number
}

/** 读取授权用户可见的全部报表摘要，筛选和分页由现有列表处理。 */
export async function listCompareReports() {
  return (await request<ApiResponse & { rows: CompareReportSummary[] }>('/system/compare-report/list')).rows
}

/** 删除整份报表及全部版本，后端在同一事务保留最小删除日志。 */
export async function deleteCompareReport(id: number) {
  await request<ApiResponse>(`/system/compare-report/${id}`, { method: 'DELETE' })
}

export interface CompareSelection {
  testId: number
  testBatteryId: number
  cycleNo: number
  stepNo: number | null
  logicalNo: number | null
}
export interface CompareCandidate {
  selection: CompareSelection
  name: string
  type: string
  groupId: number
  batteryGroup: string
  batteryNo: string
  process: string
  experimentName?: string | null
  consoleDetail?: { experimentName: string | null; batteryFields: string[]; specialFields: string[]; fieldValues: Record<string, Record<string, string>> } | null
}
export interface CompareItem {
  source: CompareCandidate
  zeroTime: number | null
  records: PersistedTestRecord[]
  logicalMapping: TestLogicStepMapping | null
  businessFields: Array<{ fieldDefinitionId: number; fieldName: string; fieldType: string; fieldValue: string | null }>
}
export interface CompareSettings {
  metrics: CompareMetricKey[]
  seriesColors: string[]
  hiddenSeriesKeys?: string[]
  batteryTemplateFields: string[]
  specialFields: string[]
  detailFieldValues: Record<string, Record<string, string>>
  fieldStructure?: CompareField[]
  sourceDetailOverrides?: Record<string, { experimentName?: string; fieldValues?: Record<string, string> }>
}
export interface CreateCompareReport {
  name: string
  description: string
  experimentName: string
  selections: CompareSelection[]
  settings: CompareSettings
}
export interface SavedCompareReport extends CompareReportSummary {
  versionNo: number
  operatorName: string
  versionCreatedAt: number
  changeSummary: string
  description: string
  experimentName: string
  items: CompareItem[]
  settings: CompareSettings
  units: Record<string, string>
  displayUnits: Record<string, string>
}
/** 字段结构不包含值；共享编号用于取数，展示名称和单位随报表版本冻结。 */
export interface CompareField { name: string; category: 'battery' | 'special'; unit: string; displayName?: string; fieldDefinitionId?: number | null }
export interface CompareFieldTemplate { id: number; name: string; type: string; fields: CompareField[]; creator: string; updatedAt: number }
/** 查看、新增或编辑权限均可读取所属报表模板。 */
export async function listCompareFieldTemplates() {
  return (await request<ApiResponse & { data: CompareFieldTemplate[] }>('/system/compare-report/templates')).data
}
/** 模板新增只发送字段结构，后端验证共享定义身份并拒绝夹带数据值。 */
export async function createCompareFieldTemplate(name: string, fields: CompareFieldTemplate['fields']) {
  return (await request<ApiResponse & { id: number }>('/system/compare-report/templates', { method: 'POST', body: JSON.stringify({ name, fields }) })).id
}
/** 显式覆盖模板只影响后续应用，不修改任何报表版本。 */
export async function updateCompareFieldTemplate(id: number, name: string, fields: CompareField[]) {
  await request<ApiResponse>(`/system/compare-report/templates/${id}`, { method: 'PUT', body: JSON.stringify({ name, fields }) })
}

/** 按报表新增权限读取检测完成测试中的可选来源。 */
export async function getCompareSources() {
  return (await request<ApiResponse & { data: CompareCandidate[] }>('/system/compare-report/sources')).data
}
/** 由后端校验所选范围并返回当前有效测量与业务字段。 */
export async function previewCompareReport(selections: CompareSelection[]) {
  return (await request<ApiResponse & { data: CompareItem[] }>('/system/compare-report/preview', {
    method: 'POST', body: JSON.stringify(selections),
  })).data
}
/** 提交来源身份和展示设置；保存时由后端重读测量并生成独立首版。 */
export async function createCompareReport(data: CreateCompareReport) {
  return (await request<ApiResponse & { data: SavedCompareReport }>('/system/compare-report', {
    method: 'POST', body: JSON.stringify(data),
  })).data
}
/** 读取独立快照；编辑权限入口只返回最新基准，指定历史版须使用查看权限入口。 */
export async function getCompareReport(id: number, versionNo?: number, editing = false) {
  const suffix = editing ? '/editing' : versionNo === undefined ? '' : `/versions/${versionNo}`
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}${suffix}`)).data
}

export interface CompareVersionSummary {
  versionNo: number
  operatorName: string
  createdAt: number
  changeSummary: string
}

/** 历史与修订摘要共用正式版本列表。 */
export async function listCompareVersions(id: number) {
  return (await request<ApiResponse & { data: CompareVersionSummary[] }>(`/system/compare-report/${id}/versions`)).data
}

/** 通过独立导出权限读取指定版本，打印不能使用页面草稿或重新读取来源。 */
export async function getComparePrintVersion(id: number, versionNo: number) {
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}/versions/${versionNo}/print`)).data
}

/** 修订 CSV 使用正式版本摘要，后端校验导出权限。 */
export async function exportCompareVersions(id: number) {
  return (await request<ApiResponse & { data: CompareVersionSummary[] }>(`/system/compare-report/${id}/versions/export`)).data
}

/** 普通编辑只提交展示值，来源范围与测量沿用快照；后端拒绝陈旧基准。 */
export async function editCompareReport(id: number, data: Omit<CreateCompareReport, 'selections'> & { baseVersionNo: number; changeSummary: string }) {
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}/versions`, {
    method: 'POST', body: JSON.stringify(data),
  })).data
}

/** 主动按最新来源生成独立版本，保留已有人工表格值。 */
export async function refreshCompareSource(id: number, baseVersionNo: number, changeSummary: string) {
  return (await request<ApiResponse & { data: SavedCompareReport }>(`/system/compare-report/${id}/refresh-source`, {
    method: 'POST', body: JSON.stringify({ baseVersionNo, changeSummary }),
  })).data
}

/** 按完整所选范围区分比对项，同一电池的不同循环或工步不合并。 */
export function compareSelectionKey(item: CompareSelection) {
  return `${item.testId}|${item.testBatteryId}|${item.cycleNo}|${item.stepNo ?? ''}|${item.logicalNo ?? ''}`
}
