"""Shared stock catalog routes for platform teGPT.

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

from fastapi import APIRouter, Depends, Query
from typing import Dict, Any
from datetime import datetime
import re

from app.db import database
from app.v1.dependencies.auth import get_current_userdetails
from app.v1.services.teGPT import get_zerodha_client_service

from .teGPT_helpers import _ensure_stock_identity, _norm_symbol

router = APIRouter()


@router.get("/stocks/search", summary="Search stocks (shared catalog)")
async def search_stocks(
    q: str = Query("", description="Search by symbol/name"),
    limit: int = Query(20, ge=1, le=50),
    db=Depends(database.get_mongo_db),
):
    query = (q or "").strip()
    if not query:
        return {"status": "ok", "items": []}

    rx = {"$regex": re.escape(query), "$options": "i"}
    cur = db["stocks"].find(
        {"$or": [{"symbol": rx}, {"name": rx}, {"tradingsymbol": rx}]},
        {"_id": 0, "stock_id": 1, "symbol": 1, "exchange": 1, "instrument_token": 1, "name": 1},
    ).limit(limit)
    return {"status": "ok", "items": list(cur)}


@router.get("/stocks/{symbol}", summary="Get stock info (no analysis)")
async def get_stock_info(
    symbol: str,
    include_quote: int = Query(0, description="1 to fetch live quote via Zerodha"),
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails),
):
    stock = _ensure_stock_identity(db, symbol)
    out = {
        "status": "ok",
        "stock": {
            "stock_id": stock.get("stock_id"),
            "symbol": stock.get("symbol"),
            "exchange": stock.get("exchange"),
            "instrument_token": stock.get("instrument_token"),
            "name": stock.get("name"),
            "segment": stock.get("segment"),
            "tick_size": stock.get("tick_size"),
            "lot_size": stock.get("lot_size"),
            "is_active": stock.get("is_active", True),
        },
        "quote": None,
    }

    if include_quote == 1:
        zerodha_client = get_zerodha_client_service(db, current_user)
        sym = _norm_symbol(symbol)
        exch = (stock.get("exchange") or "NSE").strip().upper()
        qd = zerodha_client.get_quote([f"{exch}:{sym}"])
        out["quote"] = qd.get(f"{exch}:{sym}") if isinstance(qd, dict) else None

        # Opportunistically backfill instrument_token using the user's session.
        if not stock.get("instrument_token") and isinstance(out.get("quote"), dict):
            token = out["quote"].get("instrument_token")
            if token:
                db["stocks"].update_one(
                    {"_id": stock.get("_id")},
                    {"$set": {"instrument_token": token, "instrument_updated_at": datetime.utcnow()}},
                )
                out["stock"]["instrument_token"] = token

    return out
