import uuid

from django.db import models

from core.models import Project, TimeStampedModel


class Worker(TimeStampedModel):
    RATE_TYPE_CHOICES = [("daily", "Daily Rate"), ("contract", "Contract Basis")]

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(
        Project, on_delete=models.DO_NOTHING, related_name="workers",
        db_constraint=False,  # Project lives in the shared platform DB, not this company DB
    )
    name = models.CharField(max_length=150)
    work_type = models.CharField(max_length=100, help_text="e.g. Mason, Rod binder, Helper")
    mobile_number = models.CharField(max_length=20, blank=True)
    rate_type = models.CharField(max_length=10, choices=RATE_TYPE_CHOICES, default="daily")
    daily_rate = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    contract_amount = models.DecimalField(
        max_digits=14, decimal_places=2, default=0,
        help_text="Total agreed amount, if rate type is Contract Basis",
    )
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = "labor_worker"
        ordering = ["name"]

    def __str__(self):
        return f"{self.name} ({self.work_type})"

    @property
    def total_days_worked(self):
        return self.attendances.aggregate(t=models.Sum("days_worked"))["t"] or 0

    @property
    def total_earned(self):
        if self.rate_type == "contract":
            return self.contract_amount
        return self.total_days_worked * self.daily_rate

    @property
    def total_paid(self):
        return self.payments.aggregate(t=models.Sum("amount"))["t"] or 0

    @property
    def due_amount(self):
        return self.total_earned - self.total_paid


class WorkerAttendance(TimeStampedModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    worker = models.ForeignKey(Worker, on_delete=models.CASCADE, related_name="attendances")
    date = models.DateField()
    days_worked = models.DecimalField(
        max_digits=4, decimal_places=2, default=1,
        help_text="1 = full day, 0.5 = half day, etc.",
    )
    remarks = models.CharField(max_length=255, blank=True)

    class Meta:
        db_table = "labor_attendance"
        ordering = ["-date"]
        unique_together = ["worker", "date"]

    def __str__(self):
        return f"{self.worker.name} - {self.date} ({self.days_worked} day)"


class WorkerPayment(TimeStampedModel):
    PAYMENT_TYPE_CHOICES = [("advance", "Advance"), ("wage", "Wage / Bill Payment")]

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    worker = models.ForeignKey(Worker, on_delete=models.CASCADE, related_name="payments")
    date = models.DateField()
    amount = models.DecimalField(max_digits=12, decimal_places=2)
    payment_type = models.CharField(max_length=10, choices=PAYMENT_TYPE_CHOICES, default="wage")
    remarks = models.CharField(max_length=255, blank=True)

    class Meta:
        db_table = "labor_payment"
        ordering = ["-date"]

    def __str__(self):
        return f"{self.worker.name} - {self.amount} ({self.payment_type})"

    @property
    def project(self):
        return self.worker.project
