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


class ChildQuery(BaseQuery):
    def get_by_name_and_parent(self, name, parent_id):
        return self.filter(
            and_(
                func.lower(Child.name) == func.lower(name), Child.parent_id == parent_id
            )
        ).first()

    def get_by_id(self, ids):
        if isinstance(ids, list):
            return self.filter(Child.id.in_(ids)).all()

        return self.filter(Child.id == ids).first()


class Child(TimestampMixin, db.Model):
    __tablename__ = "child"
    query_class = ChildQuery

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=False)
    parent_id = db.Column(db.Integer, db.ForeignKey("parent.id"))

    child_classes = db.relationship(
        "ChildClass", backref="child", primaryjoin="Child.id == ChildClass.child_id"
    )

    @classmethod
    def get_or_create_child(cls, child_name, parent_id):
        child = Child.query.get_by_name_and_parent(child_name, parent_id)
        if child:
            return child

        child = Child(name=child_name, parent_id=parent_id)
        db.session.add(child)
        db.session.commit()
        return child
