from fastapi import APIRouter, Query, status
from app.services.presence import get_active_sessions
from app.database import get_database
from app.repositories.session_repository import get_session_by_id

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

@router.get("/active-sessions", status_code=status.HTTP_200_OK)
async def list_active_sessions(siteId: str | None = Query(default=None, description="Optional siteId filter")):
    """
    Returns a snapshot of currently active visitor sessions for initial dashboard loading.
    Excludes ENDED sessions. Includes assignedAgentId and assignedAt fields.
    """
    db = get_database()
    active_dict = get_active_sessions(siteId)
    
    result = []
    for sid, data in active_dict.items():
        if data.get("status") == "ENDED":
            continue

        user_data = data.get("user") or {}
        user_name = user_data.get("name") if isinstance(user_data, dict) else None
        user_email = user_data.get("email") if isinstance(user_data, dict) else None
        user_id = user_data.get("id") if isinstance(user_data, dict) else None

        session_doc = None
        # Fetch extra info from DB if user details, country, or IP are missing/Unknown
        if (
            not user_name
            or not user_email
            or not data.get("country")
            or data.get("country") == "Unknown"
            or not data.get("ipAddress")
        ):
            session_doc = await get_session_by_id(db, sid)
            if session_doc:
                user_name = user_name or session_doc.get("userName")
                user_email = user_email or session_doc.get("userEmail")
                user_id = user_id or session_doc.get("userId")

        assigned_agent = data.get("assignedAgentId")
        assigned_at = data.get("assignedAt")
        if not assigned_agent and data.get("status") == "IN_CHAT":
            session_doc = session_doc or await get_session_by_id(db, sid)
            if session_doc:
                assigned_agent = session_doc.get("assignedAgentId")
                assigned_at_val = session_doc.get("assignedAt")
                if assigned_at_val:
                    assigned_at = assigned_at_val.isoformat() if hasattr(assigned_at_val, "isoformat") else str(assigned_at_val)

        resolved_country = data.get("country")
        if (not resolved_country or resolved_country == "Unknown") and session_doc:
            resolved_country = session_doc.get("country")

        resolved_ip = data.get("ipAddress")
        if not resolved_ip and session_doc:
            resolved_ip = session_doc.get("ipAddress")

        result.append({
            "sessionId": sid,
            "siteId": data.get("siteId"),
            "status": data.get("status", "RINGING"),
            "connectionStatus": data.get("connectionStatus", "online"),
            "disconnectedAt": data.get("disconnectedAt"),
            "assignedAgentId": assigned_agent,
            "assignedAt": assigned_at,
            "endedBy": data.get("endedBy"),
            "userId": user_id,
            "userName": user_name,
            "userEmail": user_email,
            "ipAddress": resolved_ip,
            "country": resolved_country or "Unknown",
            "connectedAt": data.get("connectedAt")
        })
        
    return result
