from django.conf import settings
from django.db import models
from cloudinary.models import CloudinaryField

from users.models import Company


class EmployeeDocument(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    sort_id = models.IntegerField(default=0)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='employee_documents')
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='employee_documents')
    date_added = models.DateTimeField(auto_now_add=True)
    is_required = models.BooleanField(default=False)
    last_updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['sort_id', 'id']
        unique_together = ('name', 'user', 'company')

    def __str__(self):
        return f'{self.company} - {self.user} - {self.name}'


class DocumentRecord(models.Model):
    class Status(models.TextChoices):
        REQUESTED = 'requested', 'Requested'
        PENDING_APPROVAL = 'pending_approval', 'Pending Approval'
        REJECTED = 'rejected', 'Rejected'
        APPROVED = 'approved', 'Approved'

    employee_document = models.ForeignKey(EmployeeDocument, on_delete=models.CASCADE, related_name='records')
    status = models.CharField(max_length=30, choices=Status.choices, default=Status.REQUESTED)
    uploaded_date = models.DateTimeField(blank=True, null=True)
    deadline = models.DateField(blank=True, null=True)
    approved_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        related_name='approved_document_records',
    )
    rejected_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        related_name='rejected_document_records',
    )
    last_update = models.DateTimeField(auto_now=True)
    document = CloudinaryField('file', folder='employee-documents/files', blank=True, null=True)

    class Meta:
        ordering = ['-last_update', '-id']

    def __str__(self):
        return f'{self.employee_document} [{self.status}]'
