"""
=========================================
CV6 Autonomous Engine — FastAPI Router
All endpoints for controlling and
monitoring the autonomous trading OS.
=========================================
"""

from typing import Optional, List
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel

from app.autonomous.autonomous_config import AutonomousConfig, load_config, save_config
from app.autonomous.autonomous_engine import autonomous_engine
from app.core.dependencies import get_current_user

router = APIRouter(prefix="/autonomous", tags=["Autonomous Engine"])


# ── Request/Response models ───────────────────────────────────────────────────

class StartRequest(BaseModel):
    config: Optional[AutonomousConfig] = None


class ConfigUpdateRequest(BaseModel):
    config: AutonomousConfig


# ── Control endpoints ─────────────────────────────────────────────────────────

@router.post("/start", summary="Start the autonomous trading engine")
def start_engine(req: StartRequest = StartRequest(), _user=Depends(get_current_user)):
    return autonomous_engine.start(req.config)


@router.post("/stop", summary="Stop the autonomous trading engine")
def stop_engine(_user=Depends(get_current_user)):
    return autonomous_engine.stop()


@router.post("/pause", summary="Pause the engine (keeps positions open)")
def pause_engine(_user=Depends(get_current_user)):
    return autonomous_engine.pause()


@router.post("/resume", summary="Resume a paused engine")
def resume_engine(_user=Depends(get_current_user)):
    return autonomous_engine.resume()


# ── Status / monitoring endpoints ─────────────────────────────────────────────

@router.get("/status", summary="Engine state, mode, cycle count, P&L")
def engine_status(_user=Depends(get_current_user)):
    return autonomous_engine.status()


@router.get("/log", summary="Recent decision log (last N entries)")
def decision_log(n: int = 50, _user=Depends(get_current_user)):
    entries = autonomous_engine.log.recent(n)
    return {"success": True, "count": len(entries), "entries": entries}


@router.get("/pools", summary="Capital pool breakdown per strategy")
def capital_pools(_user=Depends(get_current_user)):
    return {
        "success": True,
        "pools":   autonomous_engine.pool_manager.summary(),
        "total_unrealized_pnl": round(autonomous_engine.pool_manager.total_unrealized_pnl(), 2),
        "total_realized_pnl":   round(autonomous_engine.pool_manager.total_realized_pnl(), 2),
    }


@router.get("/positions", summary="All open autonomous positions")
def open_positions(_user=Depends(get_current_user)):
    positions = [p.to_dict() for p in autonomous_engine.pool_manager.all_positions()]
    return {"success": True, "count": len(positions), "positions": positions}


@router.get("/scan", summary="Last market scan results")
def scan_results(n: int = 30, _user=Depends(get_current_user)):
    results = [r.to_dict() for r in autonomous_engine.scan_results[:n]]
    return {
        "success":   True,
        "count":     len(results),
        "results":   results,
        "scanned_at": autonomous_engine.scanner.last_scan_time,
    }


# ── Configuration endpoints ───────────────────────────────────────────────────

@router.get("/config", summary="Get current autonomous engine configuration")
def get_config(_user=Depends(get_current_user)):
    from app.risk_guard.risk_guard import risk_guard
    cfg  = load_config()
    data = cfg.model_dump()
    # Merge in live risk guard state so frontend can display kill switch status
    data["kill_switch_active"] = risk_guard.config.kill_switch_active
    data["kill_switch_reason"] = risk_guard.config.kill_switch_reason
    return {"success": True, "config": data}


@router.post("/config", summary="Save autonomous engine configuration")
def update_config(req: ConfigUpdateRequest, _user=Depends(get_current_user)):
    from app.risk_guard.risk_guard import risk_guard
    from app.ai.ai_consensus import consensus_engine
    result = autonomous_engine.update_config(req.config)
    # Refresh AI model adapters immediately so UI toggles take effect
    consensus_engine.refresh_adapters()
    # Forward kill switch state if present in request
    cfg_dict = req.config.model_dump() if hasattr(req.config, 'model_dump') else {}
    if "kill_switch_active" in cfg_dict:
        if cfg_dict["kill_switch_active"]:
            risk_guard.activate_kill_switch(cfg_dict.get("kill_switch_reason", "Config update"))
        else:
            risk_guard.deactivate_kill_switch()
    return result


@router.get("/config/defaults", summary="Reset to default configuration")
def reset_config(_user=Depends(get_current_user)):
    from app.autonomous.autonomous_config import _DEFAULT_CONFIG, AutonomousConfig, save_config
    cfg = AutonomousConfig(**_DEFAULT_CONFIG)
    save_config(cfg)
    return {"success": True, "config": cfg.model_dump()}
