from fastapi import APIRouter, Depends, HTTPException, Request, Body
from pydantic import BaseModel
from typing import List, Optional, Dict, Any
from datetime import datetime, timezone
import uuid
import json
import os
import jwt
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials

router = APIRouter(prefix="/hltv", tags=["HLTV Pro Esports & Match Center"])

def now_iso():
    return datetime.now(timezone.utc).isoformat()

security = HTTPBearer(auto_error=False)
JWT_SECRET = os.environ.get('JWT_SECRET', 'idg_forum_super_secret_key_2026')

async def get_current_user(request: Request, creds: HTTPAuthorizationCredentials = Depends(security)):
    if not creds: return None
    try:
        payload = jwt.decode(creds.credentials, JWT_SECRET, algorithms=["HS256"])
        user_id = payload.get("sub")
        if not user_id: return None
        db = request.app.state.db
        user = await db.users.find_one({"id": user_id})
        return user
    except Exception:
        return None

async def require_auth(user = Depends(get_current_user)):
    if not user:
        raise HTTPException(status_code=401, detail="Trebuie să fii autentificat.")
    return user

# ----------------- ADVANCED MATCH DETAILS & VETOES -----------------
MOCK_MATCH_DETAILS = {
    "vitality-vs-b8": {
        "id": "vitality-vs-b8",
        "event": "Esports World Cup 2026 - Group C",
        "format": "BO3",
        "stars": 4,
        "team1": {
            "name": "Team Vitality",
            "tag": "VIT",
            "rank": 1,
            "logo": "https://api.dicebear.com/7.x/identicon/svg?seed=Vitality",
            "score": 1,
            "votes": 142
        },
        "team2": {
            "name": "B8",
            "tag": "B8",
            "rank": 22,
            "logo": "https://api.dicebear.com/7.x/identicon/svg?seed=B8",
            "score": 0,
            "votes": 19
        },
        "status": "live",
        "current_map": "de_nuke (Harta 2)",
        "stream_url": "https://www.twitch.tv/eslcs",
        "veto": [
            {"team": "B8", "action": "banned", "map": "de_anubis"},
            {"team": "Team Vitality", "action": "banned", "map": "de_ancient"},
            {"team": "B8", "action": "picked", "map": "de_mirage (13-8 Vitality)"},
            {"team": "Team Vitality", "action": "picked", "map": "de_nuke (Playing)"},
            {"team": "B8", "action": "banned", "map": "de_dust2"},
            {"team": "Team Vitality", "action": "banned", "map": "de_vertigo"},
            {"team": "Decider", "action": "decider", "map": "de_inferno"}
        ],
        "scoreboard": [
            {"player": "ZywOo", "team": "VIT", "kills": 24, "deaths": 9, "adr": 108.4, "kast": "85%", "rating": 1.74},
            {"player": "Spinx", "team": "VIT", "kills": 19, "deaths": 11, "adr": 88.2, "kast": "78%", "rating": 1.35},
            {"player": "flameZ", "team": "VIT", "kills": 16, "deaths": 12, "adr": 79.5, "kast": "75%", "rating": 1.20},
            {"player": "apEX", "team": "VIT", "kills": 14, "deaths": 13, "adr": 72.1, "kast": "70%", "rating": 1.08},
            {"player": "mezii", "team": "VIT", "kills": 12, "deaths": 11, "adr": 64.3, "kast": "75%", "rating": 1.02},
            {"player": "headtr1ck", "team": "B8", "kills": 16, "deaths": 17, "adr": 76.5, "kast": "65%", "rating": 0.98},
            {"player": "cptkurtka023", "team": "B8", "kills": 14, "deaths": 18, "adr": 68.2, "kast": "60%", "rating": 0.85},
            {"player": "npl", "team": "B8", "kills": 12, "deaths": 17, "adr": 62.1, "kast": "55%", "rating": 0.78},
            {"player": "alex666", "team": "B8", "kills": 10, "deaths": 18, "adr": 54.0, "kast": "50%", "rating": 0.65},
            {"player": "esenthial", "team": "B8", "kills": 9, "deaths": 19, "adr": 48.7, "kast": "45%", "rating": 0.58}
        ],
        "head_to_head": {
            "team1_wins": 3,
            "team2_wins": 0,
            "last_matches": ["Vitality 2-0 B8 (PGL Major)", "Vitality 2-1 B8 (ESL Pro League)"]
        },
        "live_commentary": [
            {"time": "14:10", "text": "🔥 ZywOo reușește un 1v2 Clutch pe B site cu AWP-ul, asigurând runda a 11-a pentru Vitality!"},
            {"time": "14:08", "text": "Spinx deschide runda cu un dublu entry pe Ramp."},
            {"time": "14:05", "text": "B8 cere pauză tactică (Tactical Timeout). Scor: Vitality 10 - 7 B8."}
        ]
    }
}

# ----------------- ADVANCED TEAM PROFILES & STATS -----------------
TEAM_DETAILS_DB = {
    "VIT": {
        "name": "Team Vitality",
        "tag": "VIT",
        "rank": 1,
        "points": 1000,
        "region": "Europa",
        "winrate_total": "78.4%",
        "trophies_count": 14,
        "recent_form": ["W", "W", "W", "W", "L"],
        "map_winrates": {
            "de_nuke": "88% (16 Meciuri)",
            "de_mirage": "82% (22 Meciuri)",
            "de_dust2": "75% (12 Meciuri)",
            "de_inferno": "70% (10 Meciuri)",
            "de_anubis": "65% (8 Meciuri)",
            "de_ancient": "60% (5 Meciuri)"
        },
        "roster_details": [
            {"name": "Mathieu 'ZywOo' Herbaut", "role": "AWPer / Star Player", "rating": 1.32, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=ZywOo"},
            {"name": "Dan 'apEX' Madesclaire", "role": "In-Game Leader (IGL)", "rating": 1.02, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=apEX"},
            {"name": "Lotan 'Spinx' Giladi", "role": "Rifler / Lurker", "rating": 1.18, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=Spinx"},
            {"name": "Shahar 'flameZ' Shushan", "role": "Entry Fragger", "rating": 1.15, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=flameZ"},
            {"name": "William 'mezii' Merriman", "role": "Support / Anchor", "rating": 1.05, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=mezii"}
        ],
        "trophies": ["BLAST Premier World Final 2025", "Gamers8 World Cup", "IEM Cologne Champion", "Major Champions Paris"]
    },
    "NAVI": {
        "name": "Natus Vincere",
        "tag": "NAVI",
        "rank": 2,
        "points": 932,
        "region": "Ucraina / Europa",
        "winrate_total": "74.1%",
        "trophies_count": 18,
        "recent_form": ["W", "W", "L", "W", "W"],
        "map_winrates": {
            "de_mirage": "85% (20 Meciuri)",
            "de_ancient": "80% (15 Meciuri)",
            "de_nuke": "76% (14 Meciuri)",
            "de_dust2": "68% (11 Meciuri)",
            "de_anubis": "62% (9 Meciuri)",
            "de_inferno": "55% (8 Meciuri)"
        },
        "roster_details": [
            {"name": "Valeriy 'b1t' Vakhovskiy", "role": "Star Rifler / Headshot King", "rating": 1.18, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=b1t"},
            {"name": "Aleksi 'Aleksib' Virolainen", "role": "In-Game Leader (IGL)", "rating": 0.98, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=Aleksib"},
            {"name": "Justinas 'jL' Lekavicius", "role": "Entry / MVP Major", "rating": 1.16, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=jL"},
            {"name": "Mihai 'iM' Ivan", "role": "Rifler / Space Creator", "rating": 1.12, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=iM"},
            {"name": "Ihor 'w0nderful' Zhdanov", "role": "Main AWPer", "rating": 1.15, "avatar": "https://api.dicebear.com/7.x/bottts/svg?seed=w0nderful"}
        ],
        "trophies": ["PGL CS2 Major Copenhagen", "Esports World Cup Finalist", "IEM Katowice", "BLAST Premier Spring"]
    }
}

# ----------------- PICK'EM CHALLENGE DATA -----------------
INITIAL_PICKEMS = [
    {
        "id": "pickem-major-2026",
        "title": "Esports World Cup CS2 Pick'em Challenge",
        "description": "Alege echipele care vor trece neînvinse (3-0), echipele eliminate (0-3) și campioana turneului pentru a câștiga 500 Puncte Forum & Insigna Aurie Pick'em!",
        "end_date": "2026-08-25T18:00:00Z",
        "points_reward": 500,
        "options_3_0": ["Team Vitality", "Team Spirit", "Natus Vincere", "MOUZ", "FaZe Clan"],
        "options_0_3": ["Legacy", "Magic", "B8", "Luminosity", "M80"],
        "options_champion": ["Team Vitality", "Natus Vincere", "Team Spirit", "FaZe Clan", "G2 Esports", "MOUZ"]
    }
]

# ----------------- SCRIMS & CLAN WARS FINDER -----------------
class ScrimCreateReq(BaseModel):
    clan_name: str
    clan_tag: str
    map_preference: str = "de_dust2"
    game: str = "cs2"  # cs2 or cs16
    format: str = "5v5 MR12"
    server_assigned: Optional[str] = "209.38.247.243:27015"
    date_time: str
    contact_discord: str

# ----------------- ENDPOINTS -----------------

@router.get("/ranking")
async def get_hltv_ranking(request: Request):
    db = request.app.state.db
    # Return Top 30
    from idg_hltv_ext import HLTV_TOP_30_RANKING
    return {"ranking": HLTV_TOP_30_RANKING, "updated_at": now_iso()}

@router.get("/players")
async def get_hltv_players(request: Request):
    from idg_hltv_ext import HLTV_TOP_PLAYERS
    return {"players": HLTV_TOP_PLAYERS}

@router.get("/results")
async def get_hltv_results(request: Request):
    from idg_hltv_ext import HLTV_RECENT_RESULTS
    return {"results": HLTV_RECENT_RESULTS}

@router.get("/match/{match_id}")
async def get_match_detail(match_id: str, request: Request):
    """Get full HLTV-grade match details including vetoes, scoreboards, and commentary."""
    if match_id in MOCK_MATCH_DETAILS:
        return MOCK_MATCH_DETAILS[match_id]
        
    # Generate dynamic match analysis for any match
    db = request.app.state.db
    m = await db.idg_matches.find_one({"id": match_id}, {"_id": 0})
    if not m:
        t1 = "Team Vitality"
        t2 = "Natus Vincere"
    else:
        t1 = m.get("team1_name", "Team A")
        t2 = m.get("team2_name", "Team B")
        
    return {
        "id": match_id,
        "event": m.get("tournament_name", "CS2 Pro Championship") if m else "CS2 Championship",
        "format": "BO3",
        "stars": 5,
        "team1": {
            "name": t1,
            "tag": t1[:4].upper(),
            "rank": 1,
            "logo": f"https://api.dicebear.com/7.x/identicon/svg?seed={t1}",
            "score": m.get("team1_score", 0) if m else 0,
            "votes": 85
        },
        "team2": {
            "name": t2,
            "tag": t2[:4].upper(),
            "rank": 2,
            "logo": f"https://api.dicebear.com/7.x/identicon/svg?seed={t2}",
            "score": m.get("team2_score", 0) if m else 0,
            "votes": 62
        },
        "status": m.get("status", "upcoming") if m else "upcoming",
        "current_map": m.get("map_name", "de_dust2") if m else "de_dust2",
        "stream_url": m.get("stream_url", "https://www.twitch.tv/eslcs") if m else "https://www.twitch.tv/eslcs",
        "veto": [
            {"team": t2, "action": "banned", "map": "de_vertigo"},
            {"team": t1, "action": "banned", "map": "de_ancient"},
            {"team": t2, "action": "picked", "map": "de_mirage"},
            {"team": t1, "action": "picked", "map": "de_dust2"},
            {"team": "Decider", "action": "decider", "map": "de_inferno"}
        ],
        "scoreboard": [
            {"player": f"{t1[:4]}_Star", "team": t1[:4].upper(), "kills": 21, "deaths": 11, "adr": 94.2, "kast": "80%", "rating": 1.45},
            {"player": f"{t1[:4]}_Captain", "team": t1[:4].upper(), "kills": 16, "deaths": 13, "adr": 78.4, "kast": "75%", "rating": 1.18},
            {"player": f"{t2[:4]}_AWPer", "team": t2[:4].upper(), "kills": 19, "deaths": 14, "adr": 84.1, "kast": "72%", "rating": 1.25},
            {"player": f"{t2[:4]}_Entry", "team": t2[:4].upper(), "kills": 14, "deaths": 16, "adr": 72.0, "kast": "65%", "rating": 0.95}
        ],
        "head_to_head": {
            "team1_wins": 5,
            "team2_wins": 4,
            "last_matches": [f"{t1} 2-1 {t2} (IEM Cologne)", f"{t2} 2-0 {t1} (PGL Major)"]
        },
        "live_commentary": [
            {"time": "Live", "text": f"Transmisiune în direct pe serverul dedicat de competiție. Meci între {t1} și {t2}."}
        ]
    }

@router.post("/match/{match_id}/predict")
async def place_match_prediction(match_id: str, request: Request, body: Dict[str, Any], user = Depends(require_auth)):
    db = request.app.state.db
    team_selected = body.get("team") # 1 or 2
    
    doc = {
        "user_id": user["id"],
        "username": user["username"],
        "match_id": match_id,
        "team_selected": team_selected,
        "created_at": now_iso()
    }
    await db.idg_match_predictions.update_one(
        {"user_id": user["id"], "match_id": match_id},
        {"$set": doc},
        upsert=True
    )
    return {"message": f"Predicția ta a fost înregistrată! Mult succes!"}

@router.get("/team/{tag}")
async def get_team_analytics(tag: str):
    tag_upper = tag.upper()
    if tag_upper in TEAM_DETAILS_DB:
        return TEAM_DETAILS_DB[tag_upper]
        
    return {
        "name": tag_upper,
        "tag": tag_upper,
        "rank": 10,
        "points": 450,
        "region": "Internațional",
        "winrate_total": "65.0%",
        "trophies_count": 4,
        "recent_form": ["W", "L", "W", "W", "L"],
        "map_winrates": {
            "de_dust2": "70% (10 Meciuri)",
            "de_mirage": "65% (12 Meciuri)",
            "de_inferno": "60% (8 Meciuri)",
            "de_nuke": "55% (6 Meciuri)"
        },
        "roster_details": [
            {"name": f"{tag_upper} Captain", "role": "In-Game Leader (IGL)", "rating": 1.05, "avatar": f"https://api.dicebear.com/7.x/bottts/svg?seed={tag_upper}1"},
            {"name": f"{tag_upper} AWPer", "role": "Main Sniper", "rating": 1.22, "avatar": f"https://api.dicebear.com/7.x/bottts/svg?seed={tag_upper}2"},
            {"name": f"{tag_upper} Rifler", "role": "Entry Fragger", "rating": 1.15, "avatar": f"https://api.dicebear.com/7.x/bottts/svg?seed={tag_upper}3"},
            {"name": f"{tag_upper} Support", "role": "Support / Anchor", "rating": 1.02, "avatar": f"https://api.dicebear.com/7.x/bottts/svg?seed={tag_upper}4"},
            {"name": f"{tag_upper} Lurker", "role": "Lurker", "rating": 1.10, "avatar": f"https://api.dicebear.com/7.x/bottts/svg?seed={tag_upper}5"}
        ],
        "trophies": ["INDUNGI Elite Cup Winner", "ESL Regional Challenger"]
    }

# Scrims Finder Endpoints
@router.get("/scrims")
async def list_scrims(request: Request):
    db = request.app.state.db
    scrims = await db.idg_scrims.find({}, {"_id": 0}).sort("date_time", -1).to_list(30)
    if not scrims:
        # Default mock scrims
        scrims = [
            {
                "id": "scrim-1",
                "clan_name": "TaskForce Romania",
                "clan_tag": "TFR",
                "map_preference": "de_dust2",
                "game": "cs2",
                "format": "5v5 MR12",
                "server_assigned": "209.38.247.243:27015",
                "date_time": "2026-08-14T21:00:00Z",
                "contact_discord": "discord.gg/indungi / @TFR_Leader",
                "status": "open"
            },
            {
                "id": "scrim-2",
                "clan_name": "OldSchool Legends",
                "clan_tag": "OSL",
                "map_preference": "de_inferno",
                "game": "cs16",
                "format": "5v5 MR15",
                "server_assigned": "209.38.247.243:27016",
                "date_time": "2026-08-14T22:30:00Z",
                "contact_discord": "discord.gg/indungi / @OSL_Leader",
                "status": "open"
            }
        ]
    return {"scrims": scrims}

@router.post("/scrims")
async def create_scrim(body: ScrimCreateReq, request: Request, user = Depends(require_auth)):
    db = request.app.state.db
    doc = {
        "id": f"scrim-{uuid.uuid4().hex[:8]}",
        "clan_name": body.clan_name,
        "clan_tag": body.clan_tag,
        "map_preference": body.map_preference,
        "game": body.game,
        "format": body.format,
        "server_assigned": body.server_assigned or "209.38.247.243:27015",
        "date_time": body.date_time,
        "contact_discord": body.contact_discord,
        "created_by": user["username"],
        "status": "open",
        "created_at": now_iso()
    }
    await db.idg_scrims.insert_one(doc)
    doc.pop("_id", None)
    return doc

# Pick'em Challenge Endpoints
@router.get("/pickem")
async def get_pickem():
    return {"challenges": INITIAL_PICKEMS}

@router.post("/pickem/{id}/vote")
async def vote_pickem(id: str, request: Request, body: Dict[str, Any], user = Depends(require_auth)):
    db = request.app.state.db
    doc = {
        "user_id": user["id"],
        "username": user["username"],
        "challenge_id": id,
        "pick_3_0": body.get("pick_3_0"),
        "pick_0_3": body.get("pick_0_3"),
        "pick_champion": body.get("pick_champion"),
        "created_at": now_iso()
    }
    await db.idg_pickem_votes.update_one(
        {"user_id": user["id"], "challenge_id": id},
        {"$set": doc},
        upsert=True
    )
    return {"message": "Votul tău pentru Pick'em Challenge a fost înregistrat!"}
