from django.db import models


class Hat(models.Model):
    class Status(models.TextChoices):
        DRAFT = "draft", "Draft"
        FIRST_DIBS = "first_dibs", "First Dibs"
        AVAILABLE = "available", "Available"
        SOLD = "sold", "Sold"

    name = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    image = models.ImageField(upload_to="hats/")
    status = models.CharField(
        max_length=20, choices=Status.choices, default=Status.DRAFT
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    published_at = models.DateTimeField(
        null=True,
        blank=True,
        help_text="When this hat was first made available (for email timing)",
    )
    sold_at = models.DateTimeField(null=True, blank=True)
    stripe_payment_intent_id = models.CharField(max_length=200, blank=True, default="")

    class Meta:
        ordering = ["-created_at"]
        verbose_name = "Hat"
        verbose_name_plural = "Hats"

    def __str__(self):
        return self.name

    def is_available_for_sale(self):
        if self.status == self.Status.SOLD:
            return False
        if self.status == self.Status.FIRST_DIBS:
            return False
        if self.status == self.Status.AVAILABLE:
            return True
        return False

    def can_purchase(self, customer=None):
        if self.status == self.Status.SOLD:
            return False
        if self.status == self.Status.FIRST_DIBS:
            if customer and customer.has_purchased:
                return True
            return False
        if self.status == self.Status.AVAILABLE:
            return True
        return False

    @property
    def status_display(self):
        if self.status == self.Status.FIRST_DIBS:
            return "First Dibs"
        elif self.status == self.Status.AVAILABLE:
            return "Available"
        elif self.status == self.Status.SOLD:
            return "Sold"
        return "Draft"


class Customer(models.Model):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=200)
    stripe_customer_id = models.CharField(max_length=200, blank=True, default="")
    created_at = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        ordering = ["-created_at"]

    def __str__(self):
        return self.email

    @property
    def has_purchased(self):
        return self.purchases.exists()


class Purchase(models.Model):
    customer = models.ForeignKey(
        Customer, on_delete=models.CASCADE, related_name="purchases"
    )
    hat = models.ForeignKey(Hat, on_delete=models.CASCADE, related_name="purchases")
    stripe_payment_intent_id = models.CharField(max_length=200)
    amount_paid = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-created_at"]
        unique_together = ["customer", "stripe_payment_intent_id"]

    def __str__(self):
        return f"{self.customer.email} - {self.hat.name}"
