from django.contrib.auth.models import BaseUserManager
from django.db.models import QuerySet, Exists, OuterRef

from apps.station import models as station_models


class StationQuerySet(QuerySet):
    def annotate_is_rejected_station(self):
        return self.annotate(
            is_rejected=Exists(
                station_models.RejectedStations.objects.filter(station=OuterRef("pk")),
            )
        )


class StationManager(BaseUserManager):
    """
    This is the StationManager.

    It manages queries for the Station model, filtering by is_removed=False.

    Methods:
        get_queryset: Filter the queryset to include only non-removed entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return StationQuerySet(self.model, using=self._db).filter(is_removed=False)
        # return super().get_queryset().filter(is_removed=False)


class StationAmenitiesManager(BaseUserManager):
    """
    This is the StationAmenitiesManager.

    It manages queries for the StationAmenities model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter()


class StationConnectorsManager(BaseUserManager):
    """
    This is the StationConnectorsManager.

    It manages queries for the StationConnectors model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter()


class StationUsersManager(BaseUserManager):
    """
    This is the StationUsersManager.

    It manages queries for the StationUser model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationLocationsManager(BaseUserManager):
    """
    This is the StationLocationsManager.

    It manages queries for the StationLocation model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationMediaManager(BaseUserManager):
    """
    This is the StationMediaManager.

    It manages queries for the StationMedia model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationRatingManager(BaseUserManager):
    """
    This is the StationRatingManager.

    It manages queries for the StationRating model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationRatingMediaManager(BaseUserManager):
    """
    This is the StationRatingMediaManager.

    It manages queries for the StationRatingMedia model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class SuggestStationManager(BaseUserManager):
    """
    This is the SuggestStationManager.

    It manages queries for the SuggestStation model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class SuggestStationMediaManager(BaseUserManager):
    """
    This is the SuggestStationMediaManager.

    It manages queries for the SuggestStationMedia model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationBookmarkManager(BaseUserManager):
    """
    This is the StationBookmarkManager.

    It manages queries for the StationBookmark model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationReportManager(BaseUserManager):
    """
    This is the StationReportManager.

    It manages queries for the StationReport model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationReportReasonManager(BaseUserManager):
    """
    This is the StationReportReasonManager.

    It manages queries for the StationReasonMaster model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class StationCheckInManager(BaseUserManager):
    """
    This is the StationCheckInManager.

    It manages queries for the StationCheckInManager model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)


class RejectedStationsManager(BaseUserManager):
    """
    This is the RejectedStationsManager.

    It manages queries for the RejectedStations model.

    Methods:
        get_queryset: Filter the queryset to include only entries.
    """

    def get_queryset(self):
        # Override the default queryset to filter out removed users
        return super().get_queryset().filter(is_removed=False)
