from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from django.core.mail import send_mail
from django.conf import settings
from django.utils import timezone
from datetime import timedelta

from .models import VacationRequest, VacationLog, EmployeeProfile


@receiver(post_save, sender=VacationRequest)
def log_vacation_request_creation(sender, instance, created, **kwargs):
    """Create log entry when a vacation request is created"""
    if created:
        VacationLog.objects.create(
            vacation_request=instance,
            action=VacationLog.ACTION_REQUEST,
            performed_by=instance.employee.user,
            details="Solicitação de férias criada"
        )


@receiver(pre_save, sender=VacationRequest)
def log_vacation_request_update(sender, instance, **kwargs):
    """Log changes to vacation request status"""
    if instance.pk:  # Only for existing objects
        try:
            old_instance = VacationRequest.objects.get(pk=instance.pk)
            
            # If status changed, create log entry
            if old_instance.status != instance.status:
                action = None
                
                if instance.status == VacationRequest.STATUS_APPROVED:
                    action = VacationLog.ACTION_APPROVE
                elif instance.status == VacationRequest.STATUS_REJECTED:
                    action = VacationLog.ACTION_REJECT
                elif instance.status == VacationRequest.STATUS_CANCELLED:
                    action = VacationLog.ACTION_CANCEL
                
                if action:
                    VacationLog.objects.create(
                        vacation_request=instance,
                        action=action,
                        performed_by=instance.approved_by.user if instance.approved_by else None,
                        details=f"Status alterado de {old_instance.get_status_display()} para {instance.get_status_display()}"
                    )
        except VacationRequest.DoesNotExist:
            pass  # This is a new instance, ignore


@receiver(post_save, sender=VacationRequest)
def send_vacation_notifications(sender, instance, created, **kwargs):
    """Send email notifications when vacation request status changes"""
    # Don't send notifications for new requests, that's handled in the view
    if not created and instance.status in [VacationRequest.STATUS_APPROVED, VacationRequest.STATUS_REJECTED]:
        try:
            # Notification to employee
            if instance.employee.user.email:
                status_text = "APROVADA" if instance.status == VacationRequest.STATUS_APPROVED else "REJEITADA"
                
                subject = f'Solicitação de Férias {status_text}'
                message = f'''
                Olá {instance.employee.user.first_name},
                
                Sua solicitação de férias para o período de {instance.start_date.strftime('%d/%m/%Y')} 
                a {instance.end_date.strftime('%d/%m/%Y')} foi {status_text}.
                
                '''
                
                if instance.status == VacationRequest.STATUS_REJECTED and instance.rejection_reason:
                    message += f"Motivo: {instance.rejection_reason}\n\n"
                
                message += f'''
                Atenciosamente,
                Sistema de Gestão de Férias - Grupo Kuttner
                '''
                
                send_mail(
                    subject,
                    message,
                    settings.DEFAULT_FROM_EMAIL,
                    [instance.employee.user.email],
                    fail_silently=True,
                )
                
            # Notification to HR for approved requests
            if instance.status == VacationRequest.STATUS_APPROVED:
                hr_emails = list(EmployeeProfile.objects.filter(
                    role=EmployeeProfile.USER_ROLE_ADMIN,
                    is_active=True
                ).values_list('user__email', flat=True))
                
                if hr_emails:
                    subject = f'Férias Aprovadas - {instance.employee.user.get_full_name()}'
                    message = f'''
                    Olá equipe de RH,
                    
                    As férias do colaborador {instance.employee.user.get_full_name()} (Matrícula: {instance.employee.employee_id}) 
                    foram APROVADAS para o período de {instance.start_date.strftime('%d/%m/%Y')} 
                    a {instance.end_date.strftime('%d/%m/%Y')}.
                    
                    Empresa: {instance.employee.company.name}
                    Centro de Custo: {instance.employee.cost_center.name}
                    Total de dias: {instance.total_days}
                    Dias vendidos: {instance.selling_days}
                    
                    Aprovado por: {instance.approved_by.user.get_full_name() if instance.approved_by else "N/A"}
                    Data da aprovação: {timezone.now().strftime('%d/%m/%Y %H:%M')}
                    
                    Por favor, providencie os procedimentos necessários segundo a CLT.
                    
                    Atenciosamente,
                    Sistema de Gestão de Férias - Grupo Kuttner
                    '''
                    
                    send_mail(
                        subject,
                        message,
                        settings.DEFAULT_FROM_EMAIL,
                        hr_emails,
                        fail_silently=True,
                    )
        except Exception as e:
            # Log the error but don't block the request
            print(f"Error sending email notification: {e}")


@receiver(post_save, sender=VacationRequest)
def send_notice_reminders(sender, instance, **kwargs):
    """Send reminders for vacation notices that need to be sent (30 days before vacation)"""
    # Only for approved vacations
    if instance.status == VacationRequest.STATUS_APPROVED:
        # Calculate 30 days before vacation start
        notice_date = instance.start_date - timedelta(days=30)
        today = timezone.now().date()
        
        # If today is the notice date, send reminder to HR
        if today == notice_date:
            try:
                hr_emails = list(EmployeeProfile.objects.filter(
                    role=EmployeeProfile.USER_ROLE_ADMIN,
                    is_active=True
                ).values_list('user__email', flat=True))
                
                if hr_emails:
                    subject = f'AVISO IMPORTANTE: Comunicado de Férias - {instance.employee.user.get_full_name()}'
                    message = f'''
                    Olá equipe de RH,
                    
                    HOJE é o prazo legal para enviar o comunicado de férias para o(a) colaborador(a):
                    
                    Nome: {instance.employee.user.get_full_name()}
                    Matrícula: {instance.employee.employee_id}
                    Empresa: {instance.employee.company.name}
                    Centro de Custo: {instance.employee.cost_center.name}
                    
                    Período de férias: {instance.start_date.strftime('%d/%m/%Y')} a {instance.end_date.strftime('%d/%m/%Y')}
                    
                    Conforme a CLT, o colaborador deve ser notificado com 30 dias de antecedência sobre suas férias.
                    Por favor, providencie o envio do comunicado oficial imediatamente.
                    
                    Atenciosamente,
                    Sistema de Gestão de Férias - Grupo Kuttner
                    '''
                    
                    send_mail(
                        subject,
                        message,
                        settings.DEFAULT_FROM_EMAIL,
                        hr_emails,
                        fail_silently=True,
                    )
            except Exception as e:
                # Log the error but don't block the request
                print(f"Error sending notice reminder: {e}")
