from django.db import models
from django.contrib.auth.models import User


class StaffProfile(models.Model):
    ROLE_CHOICES = [
        ('superadmin', 'Super Admin'),
        ('manager',    'Manager'),
        ('editor',     'Editor'),
        ('support',    'Support'),
        ('viewer',     'Viewer'),
    ]

    user        = models.OneToOneField(User, on_delete=models.CASCADE, related_name='staff_profile')
    role        = models.CharField(max_length=20, choices=ROLE_CHOICES, default='viewer')
    avatar      = models.ImageField(upload_to='staff/', blank=True, null=True)
    phone       = models.CharField(max_length=20, blank=True)
    bio         = models.TextField(blank=True)
    is_active   = models.BooleanField(default=True)

    # Granular permission flags
    can_manage_products    = models.BooleanField(default=False)
    can_manage_categories  = models.BooleanField(default=False)
    can_manage_orders      = models.BooleanField(default=False)
    can_manage_customers   = models.BooleanField(default=False)
    can_manage_coupons     = models.BooleanField(default=False)
    can_manage_reviews     = models.BooleanField(default=False)
    can_view_analytics     = models.BooleanField(default=False)
    can_manage_staff       = models.BooleanField(default=False)   # superadmin only

    created_by  = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='created_staff')
    created_at  = models.DateTimeField(auto_now_add=True)
    last_login_ip = models.GenericIPAddressField(null=True, blank=True)

    # Pre-configured permission sets per role
    ROLE_PERMISSIONS = {
        'superadmin': dict(
            can_manage_products=True, can_manage_categories=True,
            can_manage_orders=True,   can_manage_customers=True,
            can_manage_coupons=True,  can_manage_reviews=True,
            can_view_analytics=True,  can_manage_staff=True,
        ),
        'manager': dict(
            can_manage_products=True, can_manage_categories=True,
            can_manage_orders=True,   can_manage_customers=True,
            can_manage_coupons=True,  can_manage_reviews=True,
            can_view_analytics=True,  can_manage_staff=False,
        ),
        'editor': dict(
            can_manage_products=True, can_manage_categories=True,
            can_manage_orders=False,  can_manage_customers=False,
            can_manage_coupons=False, can_manage_reviews=True,
            can_view_analytics=False, can_manage_staff=False,
        ),
        'support': dict(
            can_manage_products=False, can_manage_categories=False,
            can_manage_orders=True,    can_manage_customers=True,
            can_manage_coupons=False,  can_manage_reviews=True,
            can_view_analytics=False,  can_manage_staff=False,
        ),
        'viewer': dict(
            can_manage_products=False, can_manage_categories=False,
            can_manage_orders=False,   can_manage_customers=False,
            can_manage_coupons=False,  can_manage_reviews=False,
            can_view_analytics=True,   can_manage_staff=False,
        ),
    }

    def apply_role_defaults(self):
        perms = self.ROLE_PERMISSIONS.get(self.role, {})
        for field, val in perms.items():
            setattr(self, field, val)

    @property
    def is_superadmin(self):
        return self.role == 'superadmin'

    @property
    def role_badge_class(self):
        return {
            'superadmin': 'badge-superadmin',
            'manager':    'badge-manager',
            'editor':     'badge-editor',
            'support':    'badge-support',
            'viewer':     'badge-viewer',
        }.get(self.role, 'badge-viewer')

    def __str__(self):
        return f"{self.user.username} ({self.get_role_display()})"

    class Meta:
        verbose_name = 'Staff Profile'
        verbose_name_plural = 'Staff Profiles'
        ordering = ['-created_at']


class ActivityLog(models.Model):
    user      = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    action    = models.CharField(max_length=300)
    details   = models.TextField(blank=True)
    ip        = models.GenericIPAddressField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-timestamp']

    def __str__(self):
        return f"{self.user} — {self.action}"



class SiteSetting(models.Model):
    store_name = models.CharField(max_length=255, default="Chiez Stores")
    store_tagline = models.CharField(max_length=255, default="Fashion Forward. Style Conscious.")
    contact_email = models.EmailField(default="chiezstores@gmail.com")
    contact_phone = models.CharField(max_length=20, default="+234 801 234 5678")
    address = models.TextField(default="Lagos, Nigeria")
    
    free_delivery_threshold = models.IntegerField(default=25000)
    standard_delivery_fee = models.IntegerField(default=2500)
    enable_cod = models.BooleanField(default=True)
    
    paystack_public_key = models.CharField(max_length=255, blank=True, null=True)
    flutterwave_public_key = models.CharField(max_length=255, blank=True, null=True)
    test_mode = models.BooleanField(default=True)
    
    instagram_url = models.URLField(blank=True, null=True)
    facebook_url = models.URLField(blank=True, null=True)
    twitter_url = models.URLField(blank=True, null=True)
    tiktok_url = models.URLField(blank=True, null=True)
    whatsapp_number = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return "Global Site Settings"