import uuid
from django.db import models
from django.utils import timezone


class PayrollIntegration(models.Model):
    """Company-level payroll integration configuration"""
    PROVIDER_CHOICES = [
        ('netvisor', 'Netvisor'),
        ('procounter', 'ProCounter'),
        ('none', 'None')
    ]
    
    SYNC_FREQUENCY_CHOICES = [
        ('daily', 'Daily'),
        ('weekly', 'Weekly'),
        ('manual', 'Manual')
    ]
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    company = models.OneToOneField('company.Company', on_delete=models.CASCADE, related_name='payroll_integration')
    provider = models.CharField(max_length=50, choices=PROVIDER_CHOICES, default='none')
    is_active = models.BooleanField(default=False)
    api_endpoint = models.URLField(blank=True, null=True, help_text='API endpoint URL for the payroll system')
    api_key = models.CharField(max_length=255, blank=True, help_text='API key or client ID (stored in plain text for now)')
    api_secret = models.CharField(max_length=255, blank=True, help_text='API secret or client secret (stored in plain text for now)')
    last_sync = models.DateTimeField(null=True, blank=True)
    sync_frequency = models.CharField(max_length=20, choices=SYNC_FREQUENCY_CHOICES, default='manual')
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table = 'payroll_integrations'
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.company.name} - {self.get_provider_display()}"


class EmployeeMapping(models.Model):
    """Map internal users to payroll employee IDs"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey('user.User', on_delete=models.CASCADE, related_name='payroll_mappings')
    payroll_integration = models.ForeignKey(PayrollIntegration, on_delete=models.CASCADE, related_name='employee_mappings')
    external_employee_id = models.CharField(max_length=100, help_text='Employee ID in the payroll system')
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table = 'payroll_employee_mappings'
        unique_together = [['user', 'payroll_integration']]
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.user.firstname} {self.user.lastname} -> {self.external_employee_id}"


class ProjectMapping(models.Model):
    """Map internal projects to payroll cost centers/job codes"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey('projects.Project', on_delete=models.CASCADE, related_name='payroll_mappings')
    payroll_integration = models.ForeignKey(PayrollIntegration, on_delete=models.CASCADE, related_name='project_mappings')
    external_project_code = models.CharField(max_length=100, help_text='Project code in the payroll system')
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table = 'payroll_project_mappings'
        unique_together = [['project', 'payroll_integration']]
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.project.name} -> {self.external_project_code}"


class PayrollSubmission(models.Model):
    """Track payroll submissions"""
    SUBMISSION_STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('submitted', 'Submitted'),
        ('failed', 'Failed'),
        ('confirmed', 'Confirmed')
    ]
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    payroll_integration = models.ForeignKey(PayrollIntegration, on_delete=models.CASCADE, related_name='submissions')
    user = models.ForeignKey('user.User', on_delete=models.CASCADE, related_name='payroll_submissions')
    period_start = models.DateField()
    period_end = models.DateField()
    submission_status = models.CharField(max_length=20, choices=SUBMISSION_STATUS_CHOICES, default='pending')
    external_reference_id = models.CharField(max_length=255, blank=True, help_text='Reference ID from payroll system')
    submitted_at = models.DateTimeField(null=True, blank=True)
    error_message = models.TextField(blank=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table = 'payroll_submissions'
        ordering = ['-created_at']
    
    def __str__(self):
        return f"{self.user.firstname} {self.user.lastname} - {self.period_start} to {self.period_end} ({self.get_submission_status_display()})"


class PayrollSubmissionStamp(models.Model):
    """Many-to-many relationship between submissions and stamps"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    submission = models.ForeignKey(PayrollSubmission, on_delete=models.CASCADE, related_name='submission_stamps')
    stamp = models.ForeignKey('stamps.Stamp', on_delete=models.CASCADE, related_name='payroll_submissions')
    created_at = models.DateTimeField(default=timezone.now)
    
    class Meta:
        db_table = 'payroll_submission_stamps'
        unique_together = [['submission', 'stamp']]
    
    def __str__(self):
        return f"{self.submission} - {self.stamp}"
