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

class EmployeeRequest(TimeStampedModel):
    class Status(models.TextChoices):
        PENDING="PENDING","Pending"; UNDER_REVIEW="UNDER_REVIEW","Under Review"; APPROVED="APPROVED","Approved"; REJECTED="REJECTED","Rejected"; RETURNED="RETURNED","Returned for Correction"; ADJUSTED="ADJUSTED","Adjusted"; CLOSED="CLOSED","Closed"
    employee = models.ForeignKey(Employee, on_delete=models.PROTECT, related_name="hr_requests")
    request_type = models.CharField(max_length=60)
    subject = models.CharField(max_length=200, blank=True)
    details = models.TextField(blank=True)
    payload = models.JSONField(default=dict, blank=True)
    attachment = models.FileField(upload_to="requests/", blank=True)
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING)
    resolution_note = models.TextField(blank=True)
    rejection_reason = models.TextField(blank=True)
    reference_no = models.CharField(max_length=40, unique=True)

class WorkflowTask(TimeStampedModel):
    class Status(models.TextChoices):
        OPEN="OPEN","Open"; APPROVED="APPROVED","Approved"; REJECTED="REJECTED","Rejected"; RETURNED="RETURNED","Returned"; CANCELLED="CANCELLED","Cancelled"
    company = models.ForeignKey(Company, on_delete=models.PROTECT, related_name="workflow_tasks")
    module = models.CharField(max_length=60)
    reference_no = models.CharField(max_length=60, db_index=True)
    title = models.CharField(max_length=200)
    assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="assigned_tasks")
    assigned_role = models.CharField(max_length=80, blank=True)
    priority = models.CharField(max_length=20, default="NORMAL")
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.OPEN)
    decision_note = models.TextField(blank=True)
    decided_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name="decided_tasks")
    decided_at = models.DateTimeField(null=True, blank=True)
    source_type = models.CharField(max_length=80, blank=True)
    source_id = models.CharField(max_length=80, blank=True)
    payload = models.JSONField(default=dict, blank=True)
    class Meta:
        indexes = [models.Index(fields=["status", "assigned_to"]), models.Index(fields=["module", "reference_no"])]

class Notification(TimeStampedModel):
    recipient = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="notifications")
    title = models.CharField(max_length=200)
    message = models.TextField()
    module = models.CharField(max_length=60, blank=True)
    reference_no = models.CharField(max_length=60, blank=True)
    read_at = models.DateTimeField(null=True, blank=True)

class ManagementNotice(TimeStampedModel):
    company = models.ForeignKey(Company, on_delete=models.PROTECT, related_name="management_notices")
    title = models.CharField(max_length=200)
    message = models.TextField()
    publish_from = models.DateTimeField()
    publish_until = models.DateTimeField(null=True, blank=True)
    audience = models.CharField(max_length=30, default="ALL")
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name="created_notices")

class NoticeRecipient(TimeStampedModel):
    notice = models.ForeignKey(ManagementNotice, on_delete=models.CASCADE, related_name="recipients")
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name="notices")
    read_at = models.DateTimeField(null=True, blank=True)
    class Meta:
        constraints = [models.UniqueConstraint(fields=["notice", "employee"], name="uq_notice_employee")]
