from django.conf import settings
from django.db import models
from apps.core.models import TimeStampedModel
from apps.employees.models import Employee

class ExitCase(TimeStampedModel):
    employee = models.ForeignKey(Employee, on_delete=models.PROTECT, related_name="exit_cases")
    resignation_reference = models.CharField(max_length=60, blank=True)
    proposed_last_working_day = models.DateField(null=True, blank=True)
    final_working_day = models.DateField(null=True, blank=True)
    final_working_day_finalized_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="finalized_exit_dates")
    final_working_day_finalized_at = models.DateTimeField(null=True, blank=True)
    status = models.CharField(max_length=30, default="CLEARANCE_PENDING")
    final_settlement_status = models.CharField(max_length=30, default="PENDING")
    completed_at = models.DateTimeField(null=True, blank=True)

class ClearanceItem(TimeStampedModel):
    exit_case = models.ForeignKey(ExitCase, on_delete=models.CASCADE, related_name="clearances")
    clearance_type = models.CharField(max_length=40)
    assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="exit_clearance_tasks")
    status = models.CharField(max_length=20, default="PENDING")
    note = models.TextField(blank=True)
    cleared_at = models.DateTimeField(null=True, blank=True)
    overridden = models.BooleanField(default=False)
    override_reason = models.TextField(blank=True)
    class Meta:
        constraints = [models.UniqueConstraint(fields=["exit_case", "clearance_type"], name="uq_exit_clearance_type")]


class FinalSettlement(TimeStampedModel):
    class Status(models.TextChoices):
        DRAFT = "DRAFT", "Draft"
        SUBMITTED = "SUBMITTED", "Submitted for Approval"
        RETURNED = "RETURNED", "Returned for Correction"
        REJECTED = "REJECTED", "Rejected"
        APPROVED = "APPROVED", "Approved"
        PAID = "PAID", "Paid"

    exit_case = models.OneToOneField(ExitCase, on_delete=models.PROTECT, related_name="final_settlement")
    payroll_record = models.ForeignKey("payroll.PayrollRecord", on_delete=models.PROTECT, null=True, blank=True, related_name="exit_settlements")
    payroll_due_amount = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    leave_encashment = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    other_earnings = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    loan_outstanding_recovery = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    other_deductions = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    net_payable = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    calculation_snapshot = models.JSONField(default=dict, blank=True)
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.DRAFT)
    prepared_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="prepared_exit_settlements")
    approved_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="approved_exit_settlements")
    approved_at = models.DateTimeField(null=True, blank=True)
    reviewer_note = models.TextField(blank=True)
    last_reviewed_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="reviewed_exit_settlements")
    last_reviewed_at = models.DateTimeField(null=True, blank=True)
    submission_count = models.PositiveIntegerField(default=0)
    payment_reference = models.CharField(max_length=120, blank=True)
    paid_at = models.DateTimeField(null=True, blank=True)
