"""Transaction model capturing deposits, withdrawals, rewards, commissions."""

from __future__ import annotations

from decimal import Decimal

from django.db import models


class Transaction(models.Model):
    """Records all wallet-impacting events with indexed metadata."""

    TYPE_DEPOSIT = "deposit"
    TYPE_WITHDRAWAL = "withdrawal"
    TYPE_INVESTMENT = "investment"
    TYPE_REWARD = "reward"
    TYPE_COMMISSION = "commission"
    TYPE_CHOICES = [
        (TYPE_DEPOSIT, "Deposit"),
        (TYPE_WITHDRAWAL, "Withdrawal"),
        (TYPE_INVESTMENT, "Investment"),
        (TYPE_REWARD, "Reward"),
        (TYPE_COMMISSION, "Commission"),
    ]

    STATUS_PENDING = "pending"
    STATUS_PROCESSING = "processing"
    STATUS_COMPLETED = "completed"
    STATUS_CANCELLED = "cancelled"
    STATUS_FORFEITED = "forfeited"
    STATUS_CHOICES = [
        (STATUS_PENDING, "Pending"),
        (STATUS_PROCESSING, "Processing"),
        (STATUS_COMPLETED, "Completed"),
        (STATUS_CANCELLED, "Cancelled"),
        (STATUS_FORFEITED, "Forfeited"),
    ]

    user = models.ForeignKey(
        "users.User",
        on_delete=models.CASCADE,
        related_name="transactions",
    )
    transaction_type = models.CharField(max_length=20, choices=TYPE_CHOICES)
    amount = models.DecimalField(max_digits=20, decimal_places=8)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES)
    balance_before = models.DecimalField(max_digits=20, decimal_places=8)
    balance_after = models.DecimalField(max_digits=20, decimal_places=8)

    blockchain = models.CharField(
        max_length=50,
        null=True,
        blank=True,
        db_index=True,
        help_text="Blockchain for deposits/withdrawals (e.g., tron, bnb).",
    )
    transaction_hash = models.CharField(
        max_length=255,
        null=True,
        blank=True,
        db_index=True,
    )
    data = models.JSONField(default=dict, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "transactions"
        indexes = [
            models.Index(fields=["user", "transaction_type"]),
            models.Index(fields=["status", "created_at"]),
            models.Index(fields=["transaction_type", "blockchain"]),
        ]

    def __str__(self) -> str:
        return f"{self.transaction_type} - {self.user.first_name} - ${self.amount}"

    def get_explorer_link(self) -> str:
        """Return explorer link stored in JSON metadata."""
        return self.data.get("explorer_link", "") if self.data else ""

    def set_explorer_link(self, link: str) -> None:
        """Set explorer link in JSON metadata."""
        if not self.data:
            self.data = {}
        self.data["explorer_link"] = link
