from django.conf import settings
from django.db import models


class FinanceAccount(models.Model):
    TYPES = [("cash", "cash"), ("bank", "bank")]

    organization = models.ForeignKey("organizations.Organization", on_delete=models.CASCADE, related_name="finance_accounts")
    name = models.CharField(max_length=120)
    type = models.CharField(max_length=10, choices=TYPES, default="bank")
    opening_balance = models.BigIntegerField(default=0)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["id"]
        constraints = [models.UniqueConstraint(fields=["organization", "name"], name="unique_finance_account_name")]


class FinanceCategory(models.Model):
    KINDS = [("income", "income"), ("expense", "expense")]

    organization = models.ForeignKey("organizations.Organization", on_delete=models.CASCADE, related_name="finance_categories")
    name = models.CharField(max_length=120)
    kind = models.CharField(max_length=10, choices=KINDS)

    class Meta:
        ordering = ["kind", "name"]
        constraints = [models.UniqueConstraint(fields=["organization", "name", "kind"], name="unique_finance_category")]


class Transaction(models.Model):
    KINDS = [("income", "income"), ("expense", "expense")]
    SOURCES = [("manual", "manual"), ("invoice", "invoice"), ("payroll", "payroll")]

    organization = models.ForeignKey("organizations.Organization", on_delete=models.CASCADE, related_name="finance_transactions")
    account = models.ForeignKey(FinanceAccount, on_delete=models.PROTECT, related_name="transactions")
    category = models.ForeignKey(FinanceCategory, null=True, blank=True, on_delete=models.SET_NULL, related_name="transactions")
    kind = models.CharField(max_length=10, choices=KINDS)
    amount = models.BigIntegerField()  # always positive; the kind gives the direction
    date = models.DateField()
    description = models.CharField(max_length=300, blank=True, default="")
    source_type = models.CharField(max_length=10, choices=SOURCES, default="manual")
    source_id = models.PositiveIntegerField(null=True, blank=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name="+")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-date", "-id"]
        indexes = [models.Index(fields=["organization", "date"])]
        constraints = [
            # an invoice / payroll run can be recorded in the books only once
            models.UniqueConstraint(
                fields=["organization", "source_type", "source_id"],
                condition=~models.Q(source_type="manual"),
                name="unique_finance_source",
            )
        ]
