"""AegisTrade AI Data Models and Table Definitions."""
from __future__ import annotations

import json
from dataclasses import asdict, dataclass, field
from datetime import datetime, timezone
from decimal import Decimal
from typing import Any, Optional


@dataclass
class UserRecord:
    id: str
    username: str
    password_hash: str
    role: str = "operator"
    is_active: bool = True
    created_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())


@dataclass
class SystemStateRecord:
    key: str
    value_json: str
    updated_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())


@dataclass
class ModelRecord:
    id: str
    version: str
    algorithm: str
    status: str  # CHALLENGER, CHAMPION, RETIRED
    brier_score: float
    val_accuracy: float
    metrics_json: str
    artifact_path: str
    trained_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
    promoted_at: Optional[str] = None


@dataclass
class SignalRecord:
    id: str
    model_id: str
    symbol: str
    timeframe: str
    action: str  # LONG, SHORT, NO_TRADE
    raw_probability: float
    calibrated_probability: float
    expected_return: float
    expected_risk: float
    expected_value: float
    regime: str
    reason: str
    timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())


@dataclass
class RiskDecisionRecord:
    id: str
    signal_id: str
    approved: bool
    rejection_reason: Optional[str]
    equity_at_decision: str  # Decimal as string
    risk_budget: str
    approved_quantity: str
    entry_price: str
    stop_loss_price: str
    take_profit_price: str
    max_loss_estimate: str
    timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())


@dataclass
class OrderRecord:
    id: str  # client_order_id
    exchange_order_id: Optional[str]
    risk_decision_id: Optional[str]
    mode: str  # BACKTEST, PAPER, BYBIT_DEMO, LIVE
    symbol: str
    side: str  # BUY, SELL
    order_type: str  # MARKET, LIMIT
    quantity: str
    price: str
    stop_loss: Optional[str]
    take_profit: Optional[str]
    status: str  # REQUESTED, SUBMITTED, ACCEPTED, PARTIALLY_FILLED, FILLED, CANCELLED, REJECTED
    created_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
    updated_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())


@dataclass
class ExecutionRecord:
    id: str
    order_id: str
    exec_qty: str
    exec_price: str
    exec_fee: str
    fee_asset: str
    exec_time: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())


@dataclass
class PositionRecord:
    id: str
    symbol: str
    mode: str
    side: str  # LONG, SHORT
    quantity: str
    entry_price: str
    current_price: str
    stop_loss: str
    take_profit: str
    unrealized_pnl: str
    realized_pnl: str
    is_open: bool
    opened_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
    closed_at: Optional[str] = None


@dataclass
class AuditLogRecord:
    id: str
    user_id: Optional[str]
    action: str
    entity_type: str
    entity_id: str
    details_json: str
    ip_address: Optional[str] = None
    timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
