from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy import and_
from sortedcontainers import SortedDict
from dostadmin import db
from dostadmin.mixins import TimestampMixin
import json


class ChildTrackerQuery(BaseQuery):
    def get_tracker_with_details(
        self, school_id, teacher_id, class_id, parent_id, child_id
    ):
        return self.filter(
            and_(
                ChildTracker.teacher_id == teacher_id,
                ChildTracker.school_id == school_id,
                ChildTracker.class_id == class_id,
                ChildTracker.parent_id == parent_id,
                ChildTracker.child_id == child_id,
            )
        ).first()


class ChildTracker(TimestampMixin, db.Model):
    __tablename__ = "childtracker"
    query_class = ChildTrackerQuery

    id = db.Column(db.Integer, primary_key=True)
    teacher_id = db.Column(db.Integer, db.ForeignKey("teacher.id"))
    parent_id = db.Column(db.Integer, db.ForeignKey("parent.id"))
    child_id = db.Column(db.Integer, db.ForeignKey("child.id"))
    class_id = db.Column(db.Integer, db.ForeignKey("class.id"))
    school_id = db.Column(db.Integer, db.ForeignKey("partner.id"))
    daily_observation = db.Column(JSONB, server_default="{}")
    triggers = db.Column(JSONB, server_default="{}")
    prev_trigger_date = db.Column(JSONB, server_default="{}")

    def get_daily_observation(self):
        info = SortedDict()
        if self.daily_observation:
            dc = json.loads(self.daily_observation)
            for k in dc.keys():
                info[k] = dc[k]
        return info
