export type Direction = "CALL" | "PUT" | "BUY" | "SELL";
export type SignalType = "options" | "swing" | "crypto";
export type SignalStatus = "approved" | "rejected";
export type RiskRating = "low" | "medium" | "high";

export interface Signal {
  id: number;
  symbol: string;
  company: string;
  direction: Direction;
  signal_type?: SignalType;
  status: SignalStatus;
  risk_rating: RiskRating;
  price: number;
  confidence: number;
  probability: number;
  entry: number;
  stop_loss: number;
  target1: number;
  target2: number;
  risk_reward: number;
  position_size: number;
  max_risk_usd: number;
  scores: Record<string, number>;
  rationale: string[];
  rejection_reasons: string[];
  option_contract: OptionContract | Record<string, never>;
  indicators: Indicators;
  history: number[];
  created_at: string;
}

export interface OptionContract {
  symbol: string;
  type: "call" | "put";
  strike: number;
  expiry: string;
  bid: number;
  ask: number;
  mid?: number;
  spread_pct?: number;
  iv: number;
  delta: number;
  gamma: number;
  theta: number;
  vega: number;
  open_interest: number;
  volume: number;
}

export interface Indicators {
  rsi: number | null;
  macd: { line: number; signal: number; histogram: number } | null;
  ema9: number | null;
  ema21: number | null;
  sma50: number | null;
  bollinger: { upper: number; mid: number; lower: number; pct_b: number } | null;
  atr: number;
  momentum_5d_pct: number;
}

export interface ScannerRow {
  symbol: string;
  company: string;
  price: number;
  change_pct: number;
  volume: number;
  relative_volume: number;
  activity_score: number;
}

export interface ScanRun {
  id: number;
  started_at: string;
  universe_size: number;
  candidates: number;
  signals_created: number;
  results: ScannerRow[];
}

export interface PaperTrade {
  id: number;
  signal_id: number | null;
  symbol: string;
  direction: Direction;
  quantity: number;
  entry_price: number;
  stop_loss: number;
  target: number;
  status: "open" | "closed";
  instrument?: "shares" | "option";
  option_contract?: OptionContract | null;
  option_entry_premium?: number | null;
  option_last_premium?: number | null;
  option_contracts?: number;
  option_pnl?: number;
  exit_price: number | null;
  exit_reason: string | null;
  pnl: number;
  last_price: number;
  opened_at: string;
  closed_at: string | null;
}

export interface Portfolio {
  account_equity: number;
  starting_equity: number;
  realized_pnl: number;
  unrealized_pnl: number;
  open_trades: number;
  closed_trades: number;
  win_rate: number;
  open_risk_usd: number;
  max_daily_risk_usd: number;
  risk_utilization_pct: number;
}

export interface RiskRules {
  account_equity: number;
  max_risk_per_trade_pct: number;
  max_daily_risk_pct: number;
  min_risk_reward: number;
  min_confidence: number;
  min_probability: number;
}

export interface DashboardSummary {
  portfolio: Portfolio;
  last_scan: {
    id: number;
    started_at: string;
    universe_size: number;
    candidates: number;
    signals_created: number;
  } | null;
  top_signals: Array<
    Pick<
      Signal,
      | "id" | "symbol" | "company" | "direction" | "confidence"
      | "probability" | "risk_reward" | "entry" | "risk_rating" | "history"
    >
  >;
}

export interface BacktestStats {
  trades: number;
  win_rate: number;
  avg_r: number;
  expectancy_r: number;
  profit_factor: number;
  total_r: number;
  max_drawdown_r: number;
}

export interface BacktestTrade {
  symbol?: string;
  date: string;
  direction: Direction;
  score: number;
  entry: number;
  exit: number;
  outcome: "stop" | "target" | "time";
  r: number;
}

export interface BacktestResult {
  params: { symbols: string[]; days: number; min_score: number; horizon: number };
  overall: BacktestStats;
  equity_curve_r: number[];
  per_symbol: Array<{ symbol: string } & BacktestStats>;
  recent_trades: BacktestTrade[];
  note: string;
}

export interface CalibrationBucket {
  range: [number, number];
  count: number;
  predicted_avg: number | null;
  actual_win_rate: number | null;
}

export interface Calibration {
  samples: number;
  min_samples_per_bucket: number;
  blend: number;
  buckets: CalibrationBucket[];
  active: boolean;
}

export interface StrategyPerformance {
  strategy: string;
  trades: number;
  open_trades: number;
  win_rate: number | null;
  total_pnl: number;
  avg_pnl: number | null;
  expectancy_r: number | null;
  profit_factor: number | null;
  max_drawdown: number | null;
  avg_hold_hours: number | null;
  avg_mfe_r: number | null;
  avg_mae_r: number | null;
  calibration_error: number | null;
  composite_score: number | null;
  grade: string;
  graded: boolean;
}

export interface PerformanceReport {
  strategies: StrategyPerformance[];
  min_trades_for_grade: number;
  note: string;
}

export interface Benchmark {
  period_days: number;
  spy_return_pct: number | null;
  account_return_pct: number;
  realized_pnl: number;
  trades: number;
  outperforming: boolean | null;
  note: string;
}

export interface Opportunity {
  id: number;
  symbol: string;
  direction: Direction;
  signal_type: SignalType;
  entry: number;
  stop_loss: number;
  target1: number;
  probability: number;
  confidence: number;
  readiness: number;
  readiness_breakdown: Record<string, number>;
  regime_alignment: number;
}

export interface Briefing {
  generated_at: string;
  regime: string;
  high_volatility: boolean;
  trading_mode: "Aggressive" | "Moderate" | "Defensive";
  mode_reasons: string[];
  portfolio: Portfolio & {
    pnl_today: number;
    pnl_week: number;
    pnl_month: number;
    win_rate_30d: number | null;
  };
  top_opportunities: Opportunity[];
  signals_today: number;
  briefing: string[];
}

export interface NewsArticle {
  symbol: string;
  symbols: string[];
  headline: string;
  summary: string;
  source: string;
  published: string;
  url: string | null;
  tone: "positive" | "negative" | "neutral";
}

export interface NewsFeed {
  articles: NewsArticle[];
  live: boolean;
}

export interface DailyReport {
  id: number;
  report_date: string;
  summary: string;
  payload: {
    date: string;
    signals_total: number;
    signals_approved: number;
    signals_rejected: number;
    trades_closed: number;
    day_pnl: number;
    portfolio: Portfolio;
    top_signals: Array<{
      symbol: string;
      direction: Direction;
      confidence: number;
      probability: number;
      risk_reward: number;
    }>;
  };
  created_at: string;
}
