"""File with ORM models for ScheduledCampaign entity."""
import uuid
from datetime import date

from django.db import models
from django.db.models import F
from django.db.models.query import QuerySet

from advertisers.models import Advertiser
from campaigns.models import Campaign
from mixins.models import CreateUpdateDatetimeMixin
from django.conf import settings


class ScheduledCampaign(CreateUpdateDatetimeMixin, models.Model):
    """Model for ScheduledCampaign entity."""

    id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True, editable=False)
    campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE)
    start = models.DateTimeField()
    end = models.DateTimeField()

    class Meta:
        """Meta class."""

        indexes = [
            models.Index(fields=["start"]),
            models.Index(fields=["end"]),
        ]
        permissions = [("can_use_planner", "Can use planner view")]

    def __str__(self) -> str:
        """Return the model name as a string representation of the object."""
        return self.campaign.title

    @classmethod
    def get_current_campaigns_data(  # noqa: PLR0913
        cls,
        *,
        start: date | None = None,
        end: date | None = None,
        advertiser: "Advertiser" = None,
        campaigns: list["Campaign"] | None = None,
        limit: int | None = None,
    ) -> QuerySet:
        """Get campaigns title and destination."""
        qs = (
            cls.objects.select_related("campaign__title", "campaign__destination")
            .values("campaign__title", "campaign__destination")
            .all()
        )

        if advertiser:
            qs = qs.filter(campaign__advertiser=advertiser)

        if campaigns:
            qs = qs.filter(campaign__in=campaigns)

        if start:
            qs = qs.filter(start__gte=start)

        if end:
            qs = qs.filter(end__lt=end)

        if settings.DB != "sqlite":
            qs = qs.values(name=F("campaign__title"), destination=F("campaign__destination")).distinct(
                "campaign__title", "destination"
            )

        if settings.DB == "sqlite":
            qs = qs.values(name=F("campaign__title"), destination=F("campaign__destination")).distinct()

        if limit:
            qs = qs[:limit]

        return qs
