from django.conf import settings
from django.db import models


class CustomerProfile(models.Model):
    """Extra details for a reader / customer account."""
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
    phone = models.CharField(max_length=20, blank=True, null=True, unique=True,
                             help_text="Bangladeshi mobile, e.g. 01712345678. Can be used to sign in.")
    alt_phone = models.CharField("Alternative mobile", max_length=20, blank=True,
                                 help_text="Second number for delivery calls.")
    division = models.CharField(max_length=40, blank=True)
    district = models.CharField(max_length=40, blank=True)
    area = models.CharField("Area / Upazila / Thana", max_length=80, blank=True)
    address = models.TextField("Village / Road / House / Market", blank=True,
                               help_text="Default delivery address line (filled in at checkout).")
    email_verified = models.BooleanField(default=False)
    wants_newsletter = models.BooleanField(default=False)
    google_sub = models.CharField(max_length=64, blank=True, null=True, unique=True, editable=False,
                                  help_text="Google account ID (set when the reader uses Continue with Google)")
    terms_accepted_at = models.DateTimeField("Accepted terms", null=True, blank=True,
                                             help_text="When the reader agreed to the Terms and Privacy Policy")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Reader / customer"
        verbose_name_plural = "Readers & customers"

    def __str__(self):
        return self.user.get_full_name() or self.user.email or self.user.username

    @property
    def full_address(self):
        from .locations import full_address
        return full_address(self.address, self.area, self.district, self.division)

    @property
    def has_address(self):
        return bool(self.division and self.district and self.area and self.address.strip())

    # ── Subscriber status (used on the account page and in the admin) ────────
    @property
    def magazine_access(self):
        return self.user.magazine_access.select_related('product')

    @property
    def magazines_owned(self):
        return self.user.magazine_access.filter(status='approved').count()

    @property
    def is_magazine_subscriber(self):
        return self.magazines_owned > 0

    @property
    def orders(self):
        return self.user.shop_orders.all()

    @property
    def is_shop_customer(self):
        return self.user.shop_orders.exclude(status='cancelled').exists()

    def accept_terms(self):
        """Record that the reader agreed to the Terms and Privacy Policy (first time only)."""
        if not self.terms_accepted_at:
            from django.utils import timezone
            self.terms_accepted_at = timezone.now()
            self.save(update_fields=['terms_accepted_at'])
