from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from sqlalchemy import and_
from sqlalchemy import func
from dostadmin import db
from dostadmin.mixins import TimestampMixin


class ClassQuery(BaseQuery):
    def get_all_classes(self):
        return self.filter().all()

    def get_class_by_teacher(self, teacher_id):
        return self.filter(Class.teacher_id == teacher_id).first()

    def get_class_by_grade_and_teacher(self, grade, teacher_id):
        return self.filter(
            and_(
                func.lower(Class.grade) == func.lower(grade),
                Class.teacher_id == teacher_id,
            )
        ).first()


class Class(TimestampMixin, db.Model):
    __tablename__ = "class"
    query_class = ClassQuery

    class Grade:
        PRE_NURSERY = "pn"
        NURSERY = "n"
        KG = "kg"
        ONE = "1"
        TWO = "2"
        THREE = "3"
        FOUR = "4"
        FIVE = "5"
        SIX = "6"
        SEVEN = "7"
        EIGHT = "8"
        NINE = "9"
        TEN = "10"
        ELEVEN = "11"
        TWELVE = "12"

    id = db.Column(db.Integer, primary_key=True)
    grade = db.Column(db.String(10))
    subject = db.Column(db.String(50))
    teacher_id = db.Column(db.Integer, db.ForeignKey("teacher.id"))

    child_classes = db.relationship(
        "ChildClass", backref="class", primaryjoin="Class.id == ChildClass.class_id"
    )

    @classmethod
    def get_or_create_classroom(cls, grade, teacher_id):
        classroom = Class.query.get_class_by_grade_and_teacher(grade, teacher_id)
        if classroom:
            return classroom

        classroom = Class(grade=grade, teacher_id=teacher_id)
        db.session.add(classroom)
        db.session.commit()
        return classroom
