import uuid

from django.db import models

from core.models import Project, TimeStampedModel
from members.models import Member


class Building(TimeStampedModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(
        Project, on_delete=models.DO_NOTHING, related_name="buildings",
        db_constraint=False,  # Project lives in the shared platform DB, not this company DB
    )
    name = models.CharField(max_length=150)
    total_floors = models.PositiveIntegerField(default=0)

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

    def __str__(self):
        return self.name


class Floor(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    building = models.ForeignKey(Building, on_delete=models.CASCADE, related_name="floors")
    floor_name = models.CharField(max_length=50, help_text="e.g. Ground, 1st, 2nd")
    floor_number = models.IntegerField(default=0)

    class Meta:
        db_table = "flats_floor"
        ordering = ["floor_number"]
        unique_together = ["building", "floor_number"]

    def __str__(self):
        return f"{self.building.name} - {self.floor_name}"


class Flat(TimeStampedModel):
    STATUS_CHOICES = [
        ("allocated", "Allocated to Partner"),
        ("for_sale", "For Sale"),
        ("sold", "Sold"),
        ("unallocated", "Unallocated"),
    ]

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    floor = models.ForeignKey(Floor, on_delete=models.CASCADE, related_name="flats")
    flat_no = models.CharField(max_length=20)
    owner = models.ForeignKey(
        Member, on_delete=models.SET_NULL, null=True, blank=True, related_name="flats",
        help_text="Partner this flat is allocated to (leave blank if for open sale).",
    )
    share_percent = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    size_sqft = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    parking_count = models.PositiveIntegerField(default=0)
    construction_cost = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    paid_amount = models.DecimalField(max_digits=14, decimal_places=2, default=0)
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default="unallocated")
    notes = models.TextField(blank=True)

    class Meta:
        db_table = "flats_flat"
        ordering = ["floor__floor_number", "flat_no"]
        unique_together = ["floor", "flat_no"]

    def __str__(self):
        return f"{self.floor.building.name} / {self.floor.floor_name} / {self.flat_no}"

    @property
    def due_amount(self):
        return self.construction_cost - self.paid_amount

    @property
    def project(self):
        return self.floor.building.project
