import random
import string

from django.db import models

from apps.core.models import TimeStampedModel


def generate_referral_code():
    """Generate a unique referral code like HQPCX321."""
    chars = string.ascii_uppercase + string.digits
    return "".join(random.choices(chars, k=8))


class ReferralCode(TimeStampedModel):
    """One-to-one referral code for each user."""

    user = models.OneToOneField(
        "users.User", on_delete=models.CASCADE, related_name="referral_code"
    )
    code = models.CharField(max_length=20, unique=True, default=generate_referral_code)

    class Meta:
        db_table = "referral_codes"

    def __str__(self):
        return f"{self.user} - {self.code}"


class Referral(TimeStampedModel):
    """Record of a successful referral."""

    referrer = models.ForeignKey(
        "users.User", on_delete=models.CASCADE, related_name="referrals_made"
    )
    referred = models.ForeignKey(
        "users.User", on_delete=models.CASCADE, related_name="referred_by"
    )
    awarded_points = models.PositiveIntegerField(default=20)

    class Meta:
        db_table = "referrals"
        unique_together = ["referrer", "referred"]

    def __str__(self):
        return f"{self.referrer} → {self.referred}"


class PointsBalance(TimeStampedModel):
    """User's referral points balance."""

    user = models.OneToOneField(
        "users.User", on_delete=models.CASCADE, related_name="points_balance"
    )
    points = models.PositiveIntegerField(default=0)

    class Meta:
        db_table = "points_balances"

    def __str__(self):
        return f"{self.user} - {self.points} pts"
