from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Company(models.Model):
    name = models.CharField(max_length=100)
    address = models.TextField(blank=True)
    contact_email = models.EmailField(blank=True)
    contact_phone = models.CharField(max_length=20, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'

    def __str__(self):
        return self.name

class Employee(models.Model):
    ROLE_CHOICES = [
        ('ADMIN', 'Administrator'),
        ('EMP', 'Employee'),
        ('HR', 'HR Manager'),
        ('REG', 'Registrar'),
        ('FIN', 'Finance'),
    ]

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, on_delete=models.PROTECT, null=True)
    role = models.CharField(max_length=5, choices=ROLE_CHOICES, default='EMP')
    profile_picture = models.ImageField(upload_to='profile_pictures/', blank=True, null=True)
    basic_pay = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    annual_leave_days = models.PositiveIntegerField(default=24)
    accumulated_leave_days = models.PositiveIntegerField(default=0)
    department = models.CharField(max_length=100, blank=True, null=True)

    class Meta:
        verbose_name = 'Employee'
        verbose_name_plural = 'Employees'

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

    def get_available_leave_days(self):
        return self.annual_leave_days + self.accumulated_leave_days

@receiver(post_save, sender=User)
def create_employee(sender, instance, created, **kwargs):
    if created:
        # For superusers, create an employee with Administrator role
        if instance.is_superuser:
            # Get or create a default company for superuser
            default_company, _ = Company.objects.get_or_create(
                name='ICTAZ',
                defaults={
                    'contact_email': instance.email,
                    'address': 'ICTAZ House, Lusaka',
                    'contact_phone': '+260 211 123456'
                }
            )
            # Create employee with Administrator role
            Employee.objects.create(
                user=instance,
                company=default_company,
                role='ADMIN',  # New Administrator role
                basic_pay=0,
                annual_leave_days=24,
                accumulated_leave_days=0
            )
            # Set is_staff to True for admin access
            instance.is_staff = True
            instance.save(update_fields=['is_staff'])
        else:
            # For regular users, company must be assigned manually
            Employee.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_employee(sender, instance, **kwargs):
    # Create employee profile if it doesn't exist
    if not hasattr(instance, 'employee'):
        if instance.is_superuser:
            Employee.objects.create(
                user=instance,
                role='HR',
                basic_pay=0,
                annual_leave_days=24,
                accumulated_leave_days=0
            )
        else:
            Employee.objects.create(user=instance)
