"Module used for everything related to the fat versions of models"
import typing

from hlds.definitions import location_definitions
from hlds.models import Dish, Location
from models import Order, OrderItem, User
from sqlalchemy.sql import desc, func


class FatModel:
    "General class for the fat version of models"

    @classmethod
    def all(cls):
        "Function to query all"
        # pylint: disable=E1101
        return cls.query.all()

    @classmethod
    def amount(cls):
        "Function to query the amount"
        # pylint: disable=E1101
        return cls.query.count()


class FatLocation(Location, FatModel):
    "Fat version of the Location model"

    @classmethod
    def all(cls):
        return location_definitions

    @classmethod
    def amount(cls):
        return len(location_definitions)


class FatOrder(Order, FatModel):
    "Fat version of the Order model"

    # It's hard to add the unique user constraint,
    #  as DISTINCT seems to apply after a GROUP BY and aggregate
    # So DISTINCT ... count(user_id) ... will count all users,
    #  even if they get reduced by the disctinct afterwards.
    @classmethod
    def items_per_order(cls):
        "Function to get the total of all items per order"
        return (Order.query.join(OrderItem).group_by(Order.id).with_entities(
            Order.id,
            func.count(OrderItem.user_id).label("total")))


class FatUser(User, FatModel):
    "Fat version of the User model"


class FatOrderItem(OrderItem, FatModel):
    "Fat version of the OrderItem model"
