from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from dostadmin import db
from utils.helpers.helpers import replace_chars
from dostadmin.mixins import TimestampMixin


class TimecategoryQuery(BaseQuery):
    def get_by_id(self, time_category_id):
        return self.filter(Timecategory.id == time_category_id).first()

    def get_timecategory_log(self):
        return self.order_by(Timecategory.time).all()

    def get_timecategory_for_current_hour(self, current_hour):
        return self.filter(Timecategory.time == current_hour).first()

    def find_timecategory_id_with_name(self, ip_name="6p"):
        batch_rec = self.filter(
            Timecategory.name == replace_chars(ip_name.lower())
        ).first()
        if batch_rec:
            return batch_rec.id
        return -1

    def get_least_users_timeslot(self, timeslots):
        return (
            self.filter(Timecategory.name.in_(timeslots))
            .order_by(Timecategory.active_user_count_till_yesterday)
            .first()
        )


class Timecategory(TimestampMixin, db.Model):
    __tablename__ = "timecategory"
    query_class = TimecategoryQuery

    class AnnouncementTimeCategory:
        EIGHT_AM = "08:00:00"
        NINE_AM = "09:00:00"
        TEN_AM = "10:00:00"
        ELEVEN_AM = "11:00:00"
        TWELVE_PM = "12:00:00"
        ONE_PM = "13:00:00"
        TWO_PM = "14:00:00"
        THREE_PM = "15:00:00"
        FOUR_PM = "16:00:00"
        FIVE_PM = "17:00:00"
        SIX_PM = "18:00:00"
        SEVEN_PM = "19:00:00"
        EIGHT_PM = "20:00:00"

        CHOICES = (
            ("", "User's timeslot"),
            (EIGHT_AM, "8 AM"),
            (NINE_AM, "9 AM"),
            (TEN_AM, "10 AM"),
            (ELEVEN_AM, "11 AM"),
            (TWELVE_PM, "12 noon"),
            (ONE_PM, "1 PM"),
            (TWO_PM, "2 PM"),
            (THREE_PM, "3 PM"),
            (FOUR_PM, "4 PM"),
            (FIVE_PM, "5 PM"),
            (SIX_PM, "6 PM"),
            (SEVEN_PM, "7 PM"),
            (EIGHT_PM, "8 PM"),
        )

    class TimeRange:
        MORNING_TIME_RANGE = "MORNING_TIME_RANGE"
        AFTERNOON_TIME_RANGE = "AFTERNOON_TIME_RANGE"
        EVENING_TIME_RANGE = "EVENING_TIME_RANGE"
        MORNING_TIME_RANGE_HINDI = "सुबह समय श्रेणी"
        AFTERNOON_TIME_RANGE_HINDI = "दोपहर समय श्रेणी"
        EVENING_TIME_RANGE_HINDI = "शाम समय श्रेणी"

        RANGE = (
            (MORNING_TIME_RANGE, "MORNING_TIME_RANGE"),
            (AFTERNOON_TIME_RANGE, "AFTERNOON_TIME_RANGE"),
            (EVENING_TIME_RANGE, "EVENING_TIME_RANGE"),
        )
        HINDI_RANGE = (
            (MORNING_TIME_RANGE, "सुबह समय श्रेणी"),
            (AFTERNOON_TIME_RANGE, "दोपहर समय श्रेणी"),
            (EVENING_TIME_RANGE, "शाम समय श्रेणी"),
        )

    class Category:
        EIGHT_AM = "8a"
        NINE_AM = "9a"
        TEN_AM = "10a"
        ELEVEN_AM = "11a"
        TWELVE_PM = "12p"
        ONE_PM = "1p"
        TWO_PM = "2p"
        THREE_PM = "3p"
        FOUR_PM = "4p"
        FIVE_PM = "5p"
        SIX_PM = "6p"
        SEVEN_PM = "7p"
        EIGHT_PM = "8p"
        NINE_PM = "9p"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True, nullable=False)
    time = db.Column(db.String(20), nullable=False)
    active_user_count_till_yesterday = db.Column(db.Integer)

    experiences = db.relationship(
        "Experience",
        back_populates="time_category",
        primaryjoin="Timecategory.id == Experience.timecategory_id",
    )

    def __repr__(self):
        return "TimeCategory " + self.name + " " + str(self.id)
