"""Setup + movers + instruments routes for platform teGPT.

NOTE: Move-only split from `teGPT.py`.
"""

from fastapi import APIRouter, Depends, HTTPException, Query
from typing import List
import logging
from datetime import datetime

from app.db import database
from app.v1.dependencies.auth import get_current_userdetails
from app.v1.services.teGPT import (
    get_zerodha_client_service,
    refresh_instruments_service,
    validate_openai_setup,
)

from .teGPT_helpers import _get_symbols_from_live_movers, _normalize_mover_param

router = APIRouter()
logger = logging.getLogger(__name__)


# ============ HEALTH & SETUP ============

@router.get("/health", summary="Health check and OpenAI configuration status")
async def health_check():
    """Check system health and OpenAI configuration"""
    openai_status = validate_openai_setup()
    return {
        "status": "ok",
        "service": "ChatGPT Trading Engine",
        "openai_configured": openai_status["configured"],
        "openai_message": openai_status["message"]
    }

@router.get("/config", summary="Get current configuration")
async def get_config(current_user=Depends(get_current_userdetails)):
    """Get current system configuration"""
    return {
        "user_id": str(current_user.get("_id")),
        "model": "gpt-4o-mini",
        "features": {
            "bulk_analysis": True,
            "interactive_chat": True,
            "order_placement": True,
            "real_time_data": True
        }
    }


# ============ MARKET DATA ============

@router.get("/movers", summary="Get market top gainers/losers")
async def get_market_movers(
    type: str = Query("gainers", description="Type: gainers, losers, or both"),
    limit: int = Query(50, description="Maximum number of symbols"),
    db=Depends(database.get_mongo_db)
):
    """DB-only movers endpoint.

    IMPORTANT: This endpoint must NOT trigger ET scraping, Zerodha calls, or GPT.
    Background workers populate `live_movers` and `stocks`.
    """
    try:
        mover_type = _normalize_mover_param(type)
        symbols: List[str] = []
        if mover_type == "BOTH":
            # keep ordering stable: gainers then losers
            symbols = _get_symbols_from_live_movers(db, "GAINER", limit) + _get_symbols_from_live_movers(db, "LOSER", limit)
            symbols = symbols[:limit]
        else:
            symbols = _get_symbols_from_live_movers(db, mover_type, limit)

        return {
            "status": "success",
            "data": {
                "type": type,
                "symbols": symbols,
                "source": "db",
                "timestamp": datetime.utcnow(),
            },
        }
    except Exception as e:
        logger.exception("Failed to get DB movers")
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/movers/live-model")
def get_live_model_state(db=Depends(database.get_mongo_db)):
    """Return current STOCK + live_movers + latest analysis for debugging (DB-only)."""

    live = list(db["live_movers"].find({}))
    stock_ids = {doc.get("stock_id") for doc in live if doc.get("stock_id")}

    stocks = []
    if stock_ids:
        stocks = list(db["stocks"].find({"stock_id": {"$in": list(stock_ids)}}))

    latest_analysis = {}
    for sid in stock_ids:
        snap = db["stock_analysis_snapshots"].find_one(
            {"stock_id": sid}, sort=[("timestamp", -1)]
        )
        if snap:
            latest_analysis[sid] = snap

    return {
        "live_movers": live,
        "stocks": stocks,
        "latest_analysis": latest_analysis,
    }

@router.get("/movers/top10", summary="Get top 10 market movers (frontend compatibility)")
async def get_top10_movers(
    mover: str = Query("gainers", description="gainers or losers"),
    db=Depends(database.get_mongo_db)
):
    """DB-only top10 movers endpoint used by Stream UI."""
    try:
        mover_type = _normalize_mover_param(mover)
        if mover_type == "BOTH":
            symbols = (_get_symbols_from_live_movers(db, "GAINER", 10) + _get_symbols_from_live_movers(db, "LOSER", 10))[:10]
        else:
            symbols = _get_symbols_from_live_movers(db, mover_type, 10)

        return {
            "status": "ok",
            "top10": symbols,
            "source": "db",
            "timestamp": datetime.utcnow()
        }
    except Exception as e:
        logger.exception("Failed to get top10 movers")
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/instruments/refresh", summary="Refresh instrument data from Zerodha")
async def refresh_instruments(
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails)
):
    """Refresh instrument master data from Zerodha"""
    try:
        zerodha_client = get_zerodha_client_service(db, current_user)
        result = refresh_instruments_service(db, zerodha_client)
        return {"status": "success", "updated": result["count"], "timestamp": result["timestamp"]}
    except Exception as e:
        logger.exception("Failed to refresh instruments")
        raise HTTPException(status_code=500, detail=str(e))
