import uuid

from django.db import models

from core.models import Project, TimeStampedModel


class Contractor(TimeStampedModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(
        Project, on_delete=models.DO_NOTHING, related_name="contractors",
        db_constraint=False,  # Project lives in the shared platform DB, not this company DB
    )
    name = models.CharField(max_length=255)
    mobile_number = models.CharField(max_length=20, blank=True)
    work_order_no = models.CharField(max_length=100, blank=True)
    work_description = models.TextField(blank=True)
    contract_amount = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    is_active = models.BooleanField(default=True)

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

    def __str__(self):
        return self.name

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

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

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

    @property
    def remaining_amount(self):
        return self.contract_amount - self.total_paid


class ContractorBill(TimeStampedModel):
    """A running / interim bill raised by the contractor against the contract."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, related_name="bills")
    date = models.DateField()
    amount = models.DecimalField(max_digits=14, decimal_places=2)
    description = models.CharField(max_length=255, blank=True)
    attachment = models.FileField(upload_to="contractor_bills/", null=True, blank=True)

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

    def __str__(self):
        return f"{self.contractor.name} bill {self.amount} on {self.date}"


class ContractorPayment(TimeStampedModel):
    PAYMENT_TYPE_CHOICES = [("advance", "Advance"), ("bill_payment", "Bill Payment")]

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, related_name="payments")
    date = models.DateField()
    amount = models.DecimalField(max_digits=14, decimal_places=2)
    payment_type = models.CharField(max_length=15, choices=PAYMENT_TYPE_CHOICES, default="bill_payment")
    remarks = models.CharField(max_length=255, blank=True)

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

    def __str__(self):
        return f"{self.contractor.name} paid {self.amount} on {self.date}"

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