"""Public blueprint: language selection and landing."""
from flask import Blueprint, request, redirect, url_for, render_template, session
from app.extensions import db
from app.models.region import Region

bp = Blueprint("public", __name__)


@bp.route("/")
def index():
    """Root - ALWAYS ask the language first (classic entry restored).

    Every fresh visit to the site lands on the language selection page,
    exactly like before. After a language is chosen, /set-language routes
    the visitor to the right place (app for logged-in users, landing for
    guests), so nothing else about the flow changes.
    """
    # stale session (user deleted) -> clear it, then show the language page
    if "user_id" in session:
        from app.models.user import User
        user = db.session.get(User, session["user_id"])
        if not user:
            session.clear()
    return render_template("language_select.html")


@bp.route("/set-language", methods=["POST"])
def set_language():
    code = request.form.get("lang")
    region_code = request.form.get("region")
    next_url = request.form.get("next") or request.referrer

    # CRITICAL FIX: never bounce the visitor back to the language-selection
    # page itself. The language form lives on "/" and posts here; the old
    # referrer fallback redirected straight back to "/" — an infinite loop
    # ("stuck on language selection no matter how many times I pick").
    if next_url:
        try:
            from urllib.parse import urlparse
            if urlparse(next_url).path in ("", "/"):
                next_url = None
        except Exception:
            next_url = None

    if code:
        session["lang"] = code
    if region_code:
        session["region"] = region_code

    # Update user's language preference in database if logged in
    if "user_id" in session and code:
        try:
            from app.models.user import User
            user = db.session.get(User, session["user_id"])
            if user:
                user.lang = code
                db.session.commit()
        except Exception:
            pass

    # Redirect: explicit next -> that page; otherwise the natural
    # destination (app for logged-in users, landing for guests)
    if next_url and next_url != request.url:
        return redirect(next_url)
    elif "user_id" in session:
        # honor the intro tutorial gate before entering the app
        from app.models.user import User
        user = db.session.get(User, session["user_id"])
        if user and not user.intro_seen:
            return redirect(url_for("web.intro"))
        return redirect(url_for("web.home"))
    return redirect(url_for("public.landing"))


@bp.route("/landing")
def landing():
    """Main landing/intro page."""
    region = Region.query.filter_by(code=session.get("region", "global")).first()
    lang = session.get("lang", "en")

    # Live & upcoming tournaments (public showcase)
    from app.models.game import Game
    from app.models.match import Match
    from datetime import datetime
    now = datetime.utcnow()
    live_matches = (Match.query
        .filter(Match.status == "live")
        .order_by(Match.starts_at.desc())
        .limit(3).all())
    upcoming_matches = (Match.query
        .filter(Match.status == "upcoming", Match.starts_at >= now)
        .order_by(Match.starts_at.asc())
        .limit(6).all())
    active_games = (Game.query
        .filter_by(is_active=True)
        .order_by(Game.sort_order).all())

    # Count live tournaments & active players for hero stats
    live_tournaments = Match.query.filter(Match.status == "live").count()
    online_players = sum(m.current_players for m in Match.query.filter(Match.status == "live").all())
    total_prizes = sum(m.prize_pool for m in Match.query.filter(Match.status.in_(["live", "upcoming"])).all())

    return render_template("landing.html", region=region, lang=lang,
                           live_matches=live_matches,
                           upcoming_matches=upcoming_matches,
                           active_games=active_games,
                           live_tournaments=live_tournaments,
                           online_players=online_players,
                           total_prizes=total_prizes)


@bp.route("/enter-webapp")
def enter_webapp():
    """Entry point to Web App - redirect to auth or home."""
    if "user_id" in session:
        # Check if intro was seen
        from app.models.user import User
        user = db.session.get(User, session["user_id"])
        if not user.intro_seen:
            return redirect(url_for("web.intro"))
        return redirect(url_for("web.home"))
    return redirect(url_for("auth.login"))
