/**
 * 全局类型定义文件
 * 包含应用程序中使用的所有共享类型和接口
 */

// ============================================================================
// 基础数据类型
// ============================================================================

/**
 * 市场类型枚举
 */
export type MarketType = 'cn' | 'us' | 'hk' | 'jp' | 'other';

/**
 * 图表类型枚举
 */
export type ChartType = 'bar' | 'line';

/**
 * 公司基本信息接口
 */
export interface CompanyInfo {
  /** 股票代码 (如: 600519.SH) */
  ts_code: string;
  /** 公司名称 */
  name?: string;
}

/**
 * 公司搜索建议接口
 */
export interface CompanySuggestion {
  /** 股票代码 */
  ts_code: string;
  /** 公司名称 */
  name: string;
}

// ============================================================================
// 财务数据类型
// ============================================================================

/**
 * 报告期数据点接口
 */
export interface PeriodDataPoint {
  /** 报告期 (YYYYMMDD格式，如 20241231, 20250930) */
  period: string;
  /** 数值 (可为null表示无数据) */
  value: number | null;
}

/**
 * 收入数据点接口 (向后兼容)
 */
export interface RevenueDataPoint {
  /** 年份 */
  year: string;
  /** 收入值 (可为null表示无数据) */
  revenue: number | null;
}

/**
 * 财务指标配置项接口
 */
export interface FinancialMetricConfig {
  /** 显示文本 */
  displayText: string;
  /** Tushare API参数名 */
  tushareParam: string;
  /** API接口名 */
  api?: string;
  /** 指标分组 */
  group?: string;
}

/**
 * 财务数据系列接口
 */
export interface FinancialDataSeries {
  [metricKey: string]: PeriodDataPoint[];
}

/**
 * 批量财务数据响应接口
 */
export interface StepRecord {
  name: string;
  start_ts: string;
  end_ts?: string;
  duration_ms?: number;
  status: 'running' | 'done' | 'error';
  error?: string;
}

export interface FinancialMeta {
  started_at: string;
  finished_at?: string;
  elapsed_ms?: number;
  api_calls_total: number;
  api_calls_by_group: Record<string, number>;
  current_action?: string | null;
  steps: StepRecord[];
  template_id?: string | null;
}

export interface BatchFinancialDataResponse {
  /** 股票代码 */
  ts_code: string;
  /** 公司名称 */
  name?: string;
  /** 数据系列 */
  series: FinancialDataSeries;
  /** 元数据（耗时、API调用次数、步骤） */
  meta?: FinancialMeta;
}

/**
 * 财务配置响应接口
 */
export interface FinancialConfigResponse {
  /** API分组配置 */
  api_groups: {
    [groupName: string]: FinancialMetricConfig[];
  };
}

/**
 * Token使用情况接口
 */
export interface TokenUsage {
  /** 提示词token数 */
  prompt_tokens: number;
  /** 完成token数 */
  completion_tokens: number;
  /** 总token数 */
  total_tokens: number;
}

/**
 * 公司简介响应接口
 */
export interface CompanyProfileResponse {
  /** 股票代码 */
  ts_code: string;
  /** 公司名称 */
  company_name?: string;
  /** 分析内容 */
  content: string;
  /** 使用的模型 */
  model: string;
  /** Token使用情况 */
  tokens: TokenUsage;
  /** 耗时（毫秒） */
  elapsed_ms: number;
  /** 是否成功 */
  success: boolean;
  /** 错误信息 */
  error?: string;
}

/**
 * 分析响应接口
 */
export interface AnalysisResponse {
  /** 股票代码 */
  ts_code: string;
  /** 公司名称 */
  company_name?: string;
  /** 分析类型 */
  analysis_type: string;
  /** 分析内容 */
  content: string;
  /** 使用的模型 */
  model: string;
  /** Token使用情况 */
  tokens: TokenUsage;
  /** 耗时（毫秒） */
  elapsed_ms: number;
  /** 是否成功 */
  success: boolean;
  /** 错误信息 */
  error?: string;
}

/**
 * 分析结果 DTO (Analysis Result Data Transfer Object)
 * Corresponds to backend AnalysisResultDto
 */
export interface AnalysisResultDto {
  id: number;
  request_id: string; // UUID
  symbol: string;
  template_id: string;
  module_id: string;
  content: string;
  meta_data: any; // JSON
  created_at: string; // ISO8601
}

/**
 * 分析配置响应接口
 */
export interface AnalysisConfigResponse {
  /** 分析模块配置 */
  analysis_modules: Record<string, {
    name: string;
    model: string;
    prompt_template: string;
  }>;
}

/**
 * 今日快照响应接口
 */
export interface TodaySnapshotResponse {
  ts_code: string;
  trade_date: string; // YYYYMMDD
  name?: string;
  close?: number | null;
  pe?: number | null;
  pb?: number | null;
  dv_ratio?: number | null; // %
  total_mv?: number | null; // 万元
}

/**
 * 实时报价响应接口（严格TTL，无兜底）
 */
export interface RealTimeQuoteResponse {
  symbol: string;
  market: string;
  ts: string; // ISO8601
  price: number;
  open_price?: number | null;
  high_price?: number | null;
  low_price?: number | null;
  prev_close?: number | null;
  change?: number | null;
  change_percent?: number | null;
  volume?: number | null;
  source?: string | null;
}

// ============================================================================
// 表格相关类型
// ============================================================================

/**
 * 表格行数据接口
 */
export interface TableRowData {
  /** 行唯一标识符 */
  id: string;
  /** 显示文本 */
  displayText: string;
  /** 各年份的值 */
  values: Record<string, string | number | null>;
  /** 指标分组 */
  group?: string;
  /** API接口名 */
  api?: string;
  /** Tushare参数名 */
  tushareParam?: string;
}

/**
 * 表格行配置接口
 */
export interface TableRowConfig {
  /** 行ID */
  rowId: string;
  /** 是否可见 */
  isVisible: boolean;
  /** 显示顺序 */
  displayOrder?: number;
}

/**
 * 表格行配置集合类型
 */
export type TableRowConfigs = Record<string, TableRowConfig>;

// ============================================================================
// 状态管理类型
// ============================================================================

/**
 * 执行步骤接口
 */
export interface ExecutionStep {
  /** 步骤唯一标识符 */
  id: string;
  /** 步骤显示名称 */
  name: string;
  /** 步骤描述 */
  description: string;
  /** 执行函数 (可选) */
  execute?: () => Promise<void>;
}

/**
 * 状态栏状态类型
 */
export type StatusBarStatus = 'idle' | 'loading' | 'success' | 'error';

/**
 * 状态栏状态接口
 */
export interface StatusBarState {
  /** 是否可见 */
  isVisible: boolean;
  /** 当前执行步骤 */
  currentStep: ExecutionStep | null;
  /** 当前步骤索引 */
  stepIndex: number;
  /** 总步骤数 */
  totalSteps: number;
  /** 执行状态 */
  status: StatusBarStatus;
  /** 错误信息 */
  errorMessage?: string;
  /** 是否可重试 */
  retryable?: boolean;
}

/**
 * 配置保存状态类型
 */
export type ConfigSaveStatus = 'idle' | 'saving' | 'success' | 'error';

/**
 * 配置保存状态接口
 */
export interface ConfigSaveState {
  /** 保存状态 */
  status: ConfigSaveStatus;
  /** 状态消息 */
  message?: string;
  /** 时间戳 */
  timestamp?: number;
}

/**
 * Task Status Enum (Matches Backend TaskStatus)
 */
export type TaskStatus = 'queued' | 'in_progress' | 'completed' | 'failed';

/**
 * Task Progress DTO (Matches Backend TaskProgress)
 */
export interface TaskProgress {
  request_id: string;
  task_name: string;
  status: TaskStatus;
  progress_percent: number;
  details: string;
  started_at: string; // ISO8601
}

// ============================================================================
// API 相关类型
// ============================================================================

/**
 * API 错误响应接口
 */
export interface ApiErrorResponse {
  /** 错误代码 */
  code?: string;
  /** 错误消息 */
  message: string;
  /** 详细信息 */
  details?: unknown;
}

/**
 * 搜索API响应接口
 */
export interface SearchApiResponse {
  /** 搜索结果项目 */
  items: CompanySuggestion[];
  /** 总数量 */
  total?: number;
}

/**
 * 批量数据请求接口
 */
export interface BatchDataRequest {
  /** 股票代码 */
  ts_code: string;
  /** 年份数量 */
  years: number;
  /** 指标列表 */
  metrics: string[];
}

// ============================================================================
// 组件属性类型
// ============================================================================

/**
 * 通用组件属性基类
 */
export interface BaseComponentProps {
  /** CSS类名 */
  className?: string;
  /** 子元素 */
  children?: React.ReactNode;
}

/**
 * 可控组件属性接口
 */
export interface ControlledComponentProps<T> {
  /** 当前值 */
  value: T;
  /** 值变更回调 */
  onChange: (value: T) => void;
}

/**
 * 异步操作属性接口
 */
export interface AsyncOperationProps {
  /** 是否正在加载 */
  loading?: boolean;
  /** 错误信息 */
  error?: string;
  /** 重试回调 */
  onRetry?: () => void;
}

// ============================================================================
// 工具类型
// ============================================================================

/**
 * 深度只读类型
 */
export type DeepReadonly<T> = {
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};

/**
 * 可选字段类型
 */
export type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;

/**
 * 必需字段类型
 */
export type Required<T, K extends keyof T> = T & { [P in K]-?: T[P] };

/**
 * 键值对类型
 */
export type KeyValuePair<K extends string | number | symbol = string, V = unknown> = Record<K, V>;

// ============================================================================
// 常量类型
// ============================================================================

/**
 * 支持的市场列表
 */
export const SUPPORTED_MARKETS: readonly MarketType[] = ['cn', 'us', 'hk', 'jp', 'other'] as const;

/**
 * 支持的图表类型列表
 */
export const SUPPORTED_CHART_TYPES: readonly ChartType[] = ['bar', 'line'] as const;

/**
 * 默认配置常量
 */
export const DEFAULT_CONFIG = {
  /** 默认查询年份数 */
  DEFAULT_YEARS: 10,
  /** 默认搜索建议数量 */
  DEFAULT_SUGGESTION_LIMIT: 8,
  /** 配置自动保存延迟 (毫秒) */
  CONFIG_SAVE_DELAY: 500,
  /** 成功状态显示时长 (毫秒) */
  SUCCESS_DISPLAY_DURATION: 2000,
  /** 错误状态显示时长 (毫秒) */
  ERROR_DISPLAY_DURATION: 10000,
} as const;

// ============================================================================
// LLM 配置相关类型（与后端 common-contracts 配置保持结构一致）
// ============================================================================

export interface LlmModel {
  /** 模型ID（如 gpt-4o） */
  model_id: string;
  /** 可选别名（用于 UI 展示） */
  name?: string | null;
  /** 是否在 UI 中可用 */
  is_active: boolean;
}

export interface LlmProvider {
  /** 供应商中文名/展示名（如 OpenAI 官方） */
  name: string;
  /** API 基础地址 */
  api_base_url: string;
  /** API 密钥（明文存储，由后端负责保护） */
  api_key: string;
  /** 启用的模型列表 */
  models: LlmModel[];
}

/** LLM Provider 注册中心：键为 provider_id（如 openai_official） */
export type LlmProvidersConfig = Record<string, LlmProvider>;

export interface AnalysisModuleConfig {
  /** 模块中文名/展示名（如 看涨分析） */
  name: string;
  /** 关联的 Provider ID（引用 LlmProvidersConfig 的键） */
  provider_id: string;
  /** 使用的模型 ID（引用 LlmModel.model_id） */
  model_id: string;
  /** 提示词模板（可使用 Tera 变量） */
  prompt_template: string;
  /** 依赖的其他模块 ID 列表 */
  dependencies: string[];
}

/** 分析模块配置集合：键为 module_id（如 bull_case） */
export type AnalysisModulesConfig = Record<string, AnalysisModuleConfig>;


// ============================================================================
// 分析模板集配置类型 (NEW)
// ============================================================================

/**
 * 单个分析模板集，代表一套完整的分析流程
 * e.g., "Standard Fundamental Analysis"
 */
export interface AnalysisTemplateSet {
  /** 人类可读的模板名称, e.g., "标准基本面分析" */
  name: string;
  /**
   * 该模板集包含的所有分析模块
   * Key: 模块ID (e.g., "fundamental_analysis")
   */
  modules: Record<string, AnalysisModuleConfig>;
}

/**
 * 整个系统的分析模板配置，作为顶级对象
 * Key: 模板ID (e.g., "standard_fundamentals")
 */
export type AnalysisTemplateSets = Record<string, AnalysisTemplateSet>;


// ============================================================================
// 数据源配置类型（与后端 common-contracts 配置保持结构一致）
// ============================================================================

export type DataSourceProvider = 'tushare' | 'finnhub' | 'alphavantage' | 'yfinance';

export interface DataSourceConfig {
  provider: DataSourceProvider;
  api_key?: string | null;
  api_url?: string | null;
  enabled: boolean;
}

export type DataSourcesConfig = Record<string, DataSourceConfig>;