from datetime import datetime
from app.extensions import db


class Wallet(db.Model):
    __tablename__ = "wallets"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    # deposit = کیف پول ورودی (فقط این برای ثبت‌نام مسابقات استفاده می‌شود)
    # payout  = کیف پول خروجی (جوایز برد مسابقات، فقط قابل برداشت)
    kind = db.Column(db.String(20), nullable=False)
    balance = db.Column(db.Float, default=0.0)
    currency = db.Column(db.String(10), default="USDT")
    last_updated = db.Column(db.DateTime, default=datetime.utcnow)

    @property
    def is_entry_wallet(self):
        """فقط کیف پول ورودی برای شرکت در مسابقات مجاز است."""
        return self.kind == "deposit"

    @property
    def label(self):
        return "Entry Wallet" if self.kind == "deposit" else "Withdrawal Wallet"

    transactions = db.relationship("Transaction", backref="wallet",
                                    lazy="dynamic", order_by="Transaction.created_at.desc()",
                                    cascade="all,delete-orphan")

    __table_args__ = (db.UniqueConstraint("user_id", "kind", name="uq_wallet"),)


class Transaction(db.Model):
    __tablename__ = "transactions"
    id = db.Column(db.Integer, primary_key=True)
    ref = db.Column(db.String(64), unique=True, index=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    wallet_id = db.Column(db.Integer, db.ForeignKey("wallets.id"), nullable=False)
    amount = db.Column(db.Integer, nullable=False)
    kind = db.Column(db.String(30), nullable=False)  # deposit/withdraw/entry/prize/refund/admin_credit/fee
    reason = db.Column(db.String(255))
    status = db.Column(db.String(20), default="completed")  # pending/completed/failed/reversed
    meta = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    created_by = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True)

    created_by_user = db.relationship("User", foreign_keys=[created_by])
    user = db.relationship("User", foreign_keys=[user_id])
