from django.db import models

from hrms.models.user import JRPUser


class Project(models.Model):
    
    STATUS_CHOICES = (
        ('N', 'New'),
        ('I', 'In Progress'),
        ('C', 'Completed'),
        ('H', 'On Hold'),
        ('X', 'Cancelled'),
    )

    project_name = models.CharField(max_length=255, unique=True)
    project_code = models.CharField(max_length=50, unique=True, null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    project_owner = models.CharField(max_length=255, null=True, blank=True)
    client_name = models.CharField(max_length=255, null=True, blank=True)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='N')
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.IntegerField( null=True, blank=True)
    updated_by = models.IntegerField( null=True, blank=True) 
 

     

    def __str__(self):
        return self.project or f"Project ID: {self.project_id}"
    
class ProjectMember(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='members')
    member = models.ForeignKey(JRPUser, on_delete=models.CASCADE, related_name='project_memberships')
    role = models.CharField(max_length=50, choices=[
        ('manager', 'Project Manager'),
        ('developer', 'Developer'),
        ('tester', 'Tester'),
        ('viewer', 'Viewer'),
    ], default='developer')
    joined_at = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.IntegerField( null=True, blank=True)
    updated_by = models.IntegerField( null=True, blank=True) 

    class Meta:
        unique_together = ('project', 'member')

    def __str__(self):
        return f"{self.member.email} in {self.project.project_name} as {self.role}"
class ProjectModule(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='module')
    title = models.CharField(max_length=255)
    description = models.TextField(null=True, blank=True)
    active=models.BooleanField(default=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.IntegerField( null=True, blank=True)
    updated_by = models.IntegerField( null=True, blank=True) 

class ProjectTask(models.Model):
    module = models.ForeignKey(ProjectModule, on_delete=models.CASCADE, related_name='mod_tasks')
    title = models.CharField(max_length=255)
    description = models.TextField(null=True, blank=True)
    assigned_members = models.ManyToManyField(JRPUser, related_name='tasks')
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    status = models.CharField(max_length=20, choices=[('new', 'New'), ('progress', 'In Progress'), ('done', 'Completed')], default='new')
    priority = models.CharField(max_length=20, choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], default='medium')
    #remarks=models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.IntegerField( null=True, blank=True)
    updated_by = models.IntegerField( null=True, blank=True) 
    
from django.db import models

class ProjectTaskAttachment(models.Model):
    task = models.ForeignKey(
        ProjectTask,
        on_delete=models.CASCADE,
        related_name='attachments'
    )
    file = models.FileField(upload_to='project_task_attachments/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.file.name



class TaskMessage(models.Model):
    task = models.ForeignKey(ProjectTask, on_delete=models.CASCADE, related_name='messages')
    sender = models.ForeignKey(JRPUser, on_delete=models.CASCADE, related_name='sent_task_messages')
    receiver = models.ForeignKey(JRPUser, on_delete=models.CASCADE, related_name='received_task_messages')
    message = models.TextField()
    sent_at = models.DateTimeField(auto_now_add=True)
    is_read = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.IntegerField( null=True, blank=True)
    updated_by = models.IntegerField( null=True, blank=True) 

    class Meta:
        ordering = ['sent_at']

    def __str__(self):
        return f'Message from {self.sender.email} to {self.receiver.email} on Task {self.task.id}'
