from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import gettext_lazy as _

from djmoney.models.fields import CurrencyField, MoneyField
from payments import PurchasedItem
from payments.models import BasePayment

from aleksis.core.mixins import ExtensibleModel, PureDjangoModel

from .base import Client


class InvoiceGroup(ExtensibleModel):
    name = models.CharField(verbose_name=_("Invoice group name"), max_length=255)
    client = models.ForeignKey(
        Client, verbose_name=_("Linked client"), related_name="invoice_groups", on_delete=models.SET_NULL, null=True
    )

    template_name = models.CharField(verbose_name=_("Template to render invoices with as PDF"), blank=True, max_length=255)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["client", "name"], name="group_uniq_per_client")
        ]


class Invoice(BasePayment, PureDjangoModel):
    group = models.ForeignKey(
        InvoiceGroup, verbose_name=_("Invoice group"), related_name="invoices", on_delete=models.SET_NULL, null=True
    )

    number = models.CharField(verbose_name=_("Invoice number"), max_length=255)

    for_content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True)
    for_object_id = models.PositiveIntegerField()
    for_object = GenericForeignKey("for_content_type", "for_object_id")

    def get_purchased_items(self):
        return self.for_object.get_purchased_items()

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["transaction_id", "group"], name="number_uniq_per_group")
        ]