

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings

class CustomUser(AbstractUser):

    # Customer Profile Fields
    phone = models.CharField(
        max_length=15,
        blank=True
    )

    middle_name = models.CharField(
        max_length=100,
        blank=True
    )

    address = models.TextField(
        blank=True,
        help_text="Full delivery address"
    )

    city = models.CharField(
        max_length=100,
        default="Port Harcourt"
    )

    state = models.CharField(
        max_length=100,
        default="Rivers"
    )

    country = models.CharField(
        max_length=100,
        default="Nigeria"
    )

    postal_code = models.CharField(
        max_length=20,
        blank=True
    )

    date_of_birth = models.DateField(
        null=True,
        blank=True
    )

    preferred_language = models.CharField(
        max_length=10,
        default="en"
    )

    profile_picture = models.ImageField(
        upload_to='customers/',
        blank=True,
        null=True
    )

    created_at = models.DateTimeField(
        auto_now_add=True
    )

    updated_at = models.DateTimeField(
        auto_now=True
    )

    def get_full_name(self):
        parts = [
            self.first_name,
            self.middle_name,
            self.last_name
        ]
        return " ".join(filter(None, parts))

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = "Customer"
        verbose_name_plural = "Customers"
class ShippingAddress(models.Model):
    
    ADDRESS_NAME=[('Home', 'Home'), ('Office', 'Office'), ('Delivery Point', 'Delivery Point')]
    customer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='shipping_addresses')
    address_name = models.CharField(max_length=100, choices=ADDRESS_NAME, help_text="e.g., Home, Office, Mum's House")
    full_address = models.TextField()
    city = models.CharField(max_length=100, default="Port Harcourt")
    state = models.CharField(max_length=100, default="Rivers")
    phone = models.CharField(max_length=15)
    
    is_default = models.BooleanField(default=False)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = "Shipping Addresses"
        ordering = ['-is_default', '-created_at']

    def __str__(self):
        return f"{self.address_name} ({self.city})"

    def save(self, *args, **kwargs):
        # Robust "Set as Default" logic
        if self.is_default:
            # If this address is being set as default, remove default flag from all other addresses of this customer
            ShippingAddress.objects.filter(customer=self.customer, is_default=True).exclude(pk=self.pk).update(is_default=False)
        elif not ShippingAddress.objects.filter(customer=self.customer, is_default=True).exclude(pk=self.pk).exists():
            # If no default address exists and this one is not being set as default, make it the default
            self.is_default = True

        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        # If deleting the default address, set the most recently created address as default
        was_default = self.is_default
        customer = self.customer
        super().delete(*args, **kwargs)

        if was_default:
            # Find the newest remaining address and make it default
            latest_address = ShippingAddress.objects.filter(customer=customer).order_by('-created_at').first()
            if latest_address:
                latest_address.is_default = True
                latest_address.save()
