#!/usr/bin/env python3
"""Seed ONE demo finished tournament with announced winners so the
Results section, podium and leaderboard stats are visible immediately.

Idempotent: skips if the demo match already exists.  --purge removes it.
"""
import sys, os, json
from datetime import datetime, timedelta

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
from app import create_app
from app.extensions import db
from app.models.game import Game, GameMode
from app.models.user import User
from app.models.match import Match, MatchParticipant
from app.models.leaderboard import PointEvent
from app.models.wallet import Wallet, Transaction
from app.models.notification import Notification

DEMO_TITLE = "FRUIT FIGHTSKILL CUP #12"

app = create_app()
with app.app_context():
    if "--purge" in sys.argv:
        m = Match.query.filter_by(title=DEMO_TITLE).first()
        if m:
            PointEvent.query.filter_by(match_id=m.id).delete(synchronize_session=False)
            Transaction.query.filter(Transaction.reason.like(f"%{DEMO_TITLE}%")).delete(synchronize_session=False)
            Notification.query.filter(Notification.body.like(f"%{DEMO_TITLE}%")).delete(synchronize_session=False)
            for p in m.participants.all():
                db.session.delete(p)
            db.session.delete(m)
            db.session.commit()
            print("demo match purged.")
        else:
            print("no demo match found.")
        sys.exit(0)

    if Match.query.filter_by(title=DEMO_TITLE).first():
        print("demo match already exists — skipping.")
        sys.exit(0)

    game = mode = None
    for g in Game.query.filter_by(is_active=True).order_by(Game.sort_order).all():
        gm = GameMode.query.filter_by(game_id=g.id).first()
        if gm:
            game, mode = g, gm
            break
    if not game or not mode:
        print("no active game/mode found — cannot seed.")
        sys.exit(1)

    users = [User.query.filter_by(username=u).first()
             for u in ("Champ", "zynox", "ProLeague", "PL")]
    users = [u for u in users if u]
    if len(users) < 3:
        print("not enough users — cannot seed.")
        sys.exit(1)

    start = datetime.utcnow() - timedelta(days=2)
    m = Match(game_id=game.id, mode_id=mode.id, title=DEMO_TITLE,
              starts_at=start, ends_at=start + timedelta(hours=2),
              entry_fee=0, prize_pool=500, capacity=32, status="finished",
              winner_participant_ids="[]")
    db.session.add(m)
    db.session.flush()

    parts = []
    for i, u in enumerate(users):
        p = MatchParticipant(match_id=m.id, user_id=u.id, status="registered",
                             registered_at=start + timedelta(minutes=i))
        db.session.add(p)
        parts.append(p)
    db.session.flush()

    winner_ids = [parts[0].id]
    share = round(m.prize_pool / len(winner_ids), 2)
    prize_by_participant = {parts[0].id: share}
    for p in parts:
        p.status = "won" if p.id in winner_ids else "lost"
        p.paid = p.id in winner_ids

    # wallet payout for the champion
    pw = Wallet.query.filter_by(user_id=parts[0].user_id, kind="payout").first()
    if not pw:
        pw = Wallet(user_id=parts[0].user_id, kind="payout", balance=0, currency="USDT")
        db.session.add(pw)
        db.session.flush()
    pw.balance = (pw.balance or 0) + share
    db.session.add(Transaction(ref=f"PRZDEMO{m.id}", user_id=parts[0].user_id,
                               wallet_id=pw.id, amount=share, kind="prize",
                               reason=f"Prize - {m.title}", status="completed"))

    # notifications (champion prize + participation points)
    db.session.add(Notification(user_id=parts[0].user_id, type="prize",
                                title="🏆 Prize Received",
                                body=f"You won {share} USDT from {m.title}! (+100 points) Added to your Withdrawal Wallet."))
    for p in parts[1:]:
        db.session.add(Notification(user_id=p.user_id, type="points",
                                    title="🎯 Points Earned",
                                    body=f"You earned +20 points for playing {m.title}. Keep climbing the leaderboard!"))

    # point ledger — 2 days ago (inside weekly AND monthly windows)
    for p in parts:
        won = p.id in winner_ids
        db.session.add(PointEvent(
            user_id=p.user_id, game_id=game.id, match_id=m.id,
            kind="win" if won else "participation",
            points=100 if won else 20,
            prize=share if won else 0.0,
            reason=f"Match: {m.title}",
            created_at=start + timedelta(hours=3)))

    m.winner_participant_ids = json.dumps(winner_ids)
    db.session.commit()
    print(f"demo match created: id={m.id} '{m.title}' champion={users[0].username}")
