from django.db import models
from django.conf import settings
from .managers import SoftDeleteManager, ActiveManager


class Business(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='business')
    name = models.CharField(max_length=120)

    # Contact Info
    phone = models.CharField(max_length=32, blank=True, null=True)
    phone_secondary = models.CharField(max_length=32, blank=True, null=True)
    email_contact = models.EmailField(blank=True, null=True)
    website = models.URLField(blank=True, null=True)
    
    # Location Info
    address = models.CharField(max_length=255, blank=True, null=True)
    city = models.CharField(max_length=100, blank=True, null=True)
    country = models.CharField(max_length=100, blank=True, null=True)
    
    # Settings
    logo = models.ImageField(upload_to='business_logos/', null=True, blank=True)
    timezone = models.CharField(max_length=100, default='America/Santiago')
    
    # Global Banner
    banner_message = models.CharField(max_length=255, blank=True, null=True)
    banner_type = models.CharField(
        max_length=20,
        choices=[('info', 'Info'), ('warning', 'Warning'), ('success', 'Success')],
        default='info'
    )
    banner_active = models.BooleanField(default=False)
    
    # Status Engine
    STATUS_CHOICES = [
        ('available', 'Disponible'),
        ('high_demand', 'Alta Demanda'),
        ('closed', 'Cerrado Temporalmente'),
    ]
    business_status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='available')
    status_message = models.CharField(max_length=255, blank=True, null=True)
    status_auto = models.BooleanField(default=False)
    
    created_at = models.DateTimeField(auto_now_add=True)

    @classmethod
    def get_current(cls):
        """Instalación Standalone: existe un único negocio."""
        return cls.objects.first()

    def __str__(self):
        return self.name

    @property
    def initials(self):
        parts = self.name.split()
        if len(parts) >= 2:
            return f"{parts[0][0]}{parts[1][0]}".upper()
        return self.name[:2].upper()

class Resource(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    email = models.EmailField(blank=True, null=True)
    photo = models.ImageField(upload_to='resources/', null=True, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    deleted_at = models.DateTimeField(null=True, blank=True)

    objects = SoftDeleteManager()
    active = ActiveManager()

    class Meta:
        indexes = [
            models.Index(fields=['user', 'is_active', 'deleted_at']),
            models.Index(fields=['user', 'deleted_at']),
        ]

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

    @property
    def initials(self):
        parts = self.name.split()
        if len(parts) >= 2:
            return f"{parts[0][0]}{parts[1][0]}".upper()
        return self.name[:2].upper()

class AppointmentType(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    slug = models.SlugField()
    description = models.TextField(blank=True)
    duration_minutes = models.IntegerField(default=30)
    slot_capacity = models.IntegerField(default=1)
    resources = models.ManyToManyField(Resource, blank=True, related_name="services")
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    deleted_at = models.DateTimeField(null=True, blank=True)

    objects = SoftDeleteManager()
    active = ActiveManager()

    class Meta:
        indexes = [
            models.Index(fields=['user', 'is_active', 'deleted_at']),
            models.Index(fields=['user', 'slug', 'deleted_at']),
        ]

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

class AvailabilityRule(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    resource = models.ForeignKey(Resource, on_delete=models.CASCADE, null=True, blank=True)
    weekday = models.IntegerField(choices=[(i, str(i)) for i in range(7)]) # 0: Dom, 1: Lun, etc.
    start_time = models.TimeField()
    end_time = models.TimeField()
    
    # Breaks support (Almuerzo)
    break_start = models.TimeField(null=True, blank=True)
    break_end = models.TimeField(null=True, blank=True)
    
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

class BlockedPeriod(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    resource = models.ForeignKey(Resource, on_delete=models.CASCADE, null=True, blank=True)
    start_date = models.DateField()
    end_date = models.DateField()
    reason = models.CharField(max_length=120, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

class ExceptionDay(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    resource = models.ForeignKey(Resource, on_delete=models.CASCADE, null=True, blank=True)
    date = models.DateField()
    is_available = models.BooleanField(default=True)
    start_time = models.TimeField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)
    reason = models.CharField(max_length=120, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

class CustomField(models.Model):
    FIELD_TYPES = [
        ('text', 'Texto'),
        ('select', 'Selección'),
        ('checkbox', 'Checkbox'),
    ]
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    appointment_type = models.ForeignKey(AppointmentType, on_delete=models.CASCADE)
    label = models.CharField(max_length=100)
    slug = models.SlugField()
    field_type = models.CharField(max_length=20, choices=FIELD_TYPES)
    options = models.JSONField(blank=True, null=True)
    is_required = models.BooleanField(default=True)