from typing import List, Optional

from fastapi import APIRouter, HTTPException, Query
from pydantic import BaseModel

from services import saxo_auth
from services.saxo_scheduler import get_watchlist, set_watchlist
from services.database import get_saxo_snapshots

router = APIRouter(prefix="/api/saxo", tags=["saxo"])


class WatchlistRequest(BaseModel):
    symbols: List[str]


@router.get("/status")
def status():
    return saxo_auth.get_status()


@router.post("/disconnect")
def disconnect():
    saxo_auth.disconnect()
    return {"disconnected": True}


@router.get("/watchlist")
def watchlist():
    return {"symbols": get_watchlist()}


@router.put("/watchlist")
def update_watchlist(req: WatchlistRequest):
    set_watchlist(req.symbols)
    return {"symbols": get_watchlist()}


@router.post("/snapshot-now/{symbol}")
def snapshot_now(symbol: str):
    from services.saxo_client import snapshot_options_chain, SaxoNotConnected
    from services.database import save_saxo_snapshot_rows
    try:
        rows = snapshot_options_chain(symbol)
    except SaxoNotConnected as e:
        raise HTTPException(status_code=401, detail=str(e))
    except ValueError as e:
        raise HTTPException(status_code=502, detail=str(e))
    save_saxo_snapshot_rows(rows)
    return {"symbol": symbol.upper(), "rows_saved": len(rows)}


@router.get("/history")
def history(
    symbol: Optional[str] = Query(None),
    date_from: Optional[str] = Query(None),
    date_to: Optional[str] = Query(None),
):
    return get_saxo_snapshots(symbol, date_from, date_to)
