import uuid

from django.db import models

from core.models import Project, TimeStampedModel

DEFAULT_CATEGORIES = [
    "Rod", "Cement", "Brick", "Sand", "Stone", "Labour Wage",
    "Contractor Bill", "Electrical", "Plumbing", "Tiles",
    "Door/Window", "Transport", "Other",
]


class ExpenseCategory(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(
        Project, on_delete=models.DO_NOTHING, related_name="expense_categories",
        db_constraint=False,  # Project lives in the shared platform DB, not this company DB
    )
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = "expenses_category"
        unique_together = ["project", "name"]
        ordering = ["name"]
        verbose_name_plural = "Expense Categories"

    def __str__(self):
        return self.name


class Expense(TimeStampedModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(
        Project, on_delete=models.DO_NOTHING, related_name="expenses",
        db_constraint=False,  # Project lives in the shared platform DB, not this company DB
    )
    category = models.ForeignKey(ExpenseCategory, on_delete=models.PROTECT, related_name="expenses")
    date = models.DateField()
    amount = models.DecimalField(max_digits=14, decimal_places=2)
    paid_to = models.CharField(max_length=255, blank=True, help_text="Vendor / shop / person paid")
    payment_method = models.CharField(
        max_length=20,
        choices=[("cash", "Cash"), ("bank", "Bank"), ("mobile_banking", "Mobile Banking"), ("other", "Other")],
        default="cash",
    )
    description = models.TextField(blank=True)
    bill_attachment = models.FileField(
        upload_to="expense_bills/", null=True, blank=True,
        help_text="Bill / invoice image or PDF",
    )

    class Meta:
        db_table = "expenses_expense"
        ordering = ["-date", "-created_at"]

    def __str__(self):
        return f"{self.category} - {self.amount} on {self.date}"
