"""Wallet service.

دو کیف پول برای هر کاربر:
  - deposit (کیف پول ورودی): شارژ کاربر، تنها منبع مجاز برای ثبت‌نام در مسابقات
  - payout  (کیف پول خروجی): جوایز برد مسابقات، صرفاً قابل برداشت و غیرقابل استفاده در مسابقات
"""
import uuid
from datetime import datetime
from app.extensions import db
from app.models.wallet import Wallet, Transaction

ENTRY_KIND = "deposit"
PAYOUT_KIND = "payout"


def get_wallet(user_id, kind=ENTRY_KIND):
    return Wallet.query.filter_by(user_id=user_id, kind=kind).first()


def ensure_wallets(user_id):
    """هر دو کیف پول را می‌سازد اگر وجود نداشته باشند."""
    created = []
    for kind in (ENTRY_KIND, PAYOUT_KIND):
        w = Wallet.query.filter_by(user_id=user_id, kind=kind).first()
        if not w:
            w = Wallet(user_id=user_id, kind=kind, balance=0, currency="USDT")
            db.session.add(w)
            created.append(w)
    if created:
        db.session.flush()
    return created


def get_entry_balance(user_id):
    """موجودی قابل استفاده برای ثبت‌نام در مسابقات (فقط کیف پول ورودی)."""
    w = get_wallet(user_id, ENTRY_KIND)
    return w.balance if w else 0


def credit_wallet(wallet_id, amount, reason, created_by=None, ref=None, kind=None):
    w = db.session.get(Wallet, wallet_id)
    if not w:
        raise ValueError("Wallet not found")
    w.balance += amount
    w.last_updated = datetime.utcnow()
    tx = Transaction(
        ref=ref or f"TX{uuid.uuid4().hex[:12].upper()}",
        user_id=w.user_id,
        wallet_id=w.id,
        amount=amount,
        kind=kind or ("admin_credit" if created_by else "credit"),
        reason=reason,
        status="completed",
        created_by=created_by,
    )
    db.session.add(tx)
    db.session.commit()
    return tx


def credit_prize(user_id, amount, reason, created_by=None, ref=None):
    """واریز جایزه به کیف پول خروجی (payout)."""
    ensure_wallets(user_id)
    w = get_wallet(user_id, PAYOUT_KIND)
    return credit_wallet(w.id, amount, reason, created_by=created_by, ref=ref, kind="prize")


def debit_wallet(wallet_id, amount, reason, created_by=None, ref=None):
    w = db.session.get(Wallet, wallet_id)
    if not w:
        raise ValueError("Wallet not found")
    if w.balance < amount:
        raise ValueError("Insufficient balance")
    w.balance -= amount
    w.last_updated = datetime.utcnow()
    tx = Transaction(
        ref=ref or f"TX{uuid.uuid4().hex[:12].upper()}",
        user_id=w.user_id,
        wallet_id=w.id,
        amount=-amount,
        kind=reason,
        reason=reason,
        status="completed",
        created_by=created_by,
    )
    db.session.add(tx)
    db.session.commit()
    return tx


def debit_entry_fee(user_id, amount, reason, ref=None):
    """کسر ورودی مسابقه — فقط از کیف پول ورودی. جوایز قابل استفاده نیستند."""
    w = get_wallet(user_id, ENTRY_KIND)
    if not w or w.balance < amount:
        raise ValueError("Insufficient entry wallet balance")
    return debit_wallet(w.id, amount, reason, ref=ref)


def list_transactions(user_id, wallet_id=None, limit=50):
    q = Transaction.query.filter_by(user_id=user_id)
    if wallet_id:
        q = q.filter_by(wallet_id=wallet_id)
    return q.order_by(Transaction.created_at.desc()).limit(limit).all()
