from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from dostadmin import app_logger, db, db_model
from utils.helpers.helpers import replace_chars
from dostadmin.mixins import TimestampMixin
from dostadmin.db_model.content_version import ContentVersion


class ContentQuery(BaseQuery):
    def get_content_with_id(self, content_id):
        return self.filter(Content.id == content_id).first()

    def get_content_log(self):
        return self.all()

    def find_content_id_with_name(self, content_name):
        content = self.filter(Content.name == replace_chars(content_name)).first()
        if content:
            return content.id
        return None


class Content(TimestampMixin, db.Model):
    __tablename__ = "content"
    query_class = ContentQuery

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True, nullable=False)
    topic_id = db.Column(db.Integer, db.ForeignKey("topic.id"))
    type = db.Column(db.String(50), nullable=True)

    campaigns = db.relationship(
        "Campaign", backref="content", primaryjoin="Content.id == Campaign.content_id"
    )
    programseq = db.relationship(
        "Programseq",
        backref="content",
        primaryjoin="Content.id == Programseq.content_id",
    )
    providernumber = db.relationship(
        "ProviderNumber",
        backref="content",
        primaryjoin="Content.id == ProviderNumber.content_id",
    )
    content_version = db.relationship(
        "ContentVersion",
        backref="content",
        primaryjoin="Content.id == ContentVersion.content_id",
    )

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

    @classmethod
    def add_new_contents(cls, content):
        for c in content:
            app_logger.info("adding content %s", c)
            errors = None
            content_name = None
            try:
                content_name = replace_chars(c[0])
                duration_secs = int(c[1])
                exotel_appid = int(c[2])
                language = replace_chars(c[3])
            except Exception as e:
                if errors:
                    app_logger.error(
                        f"Exception occurred while adding new contents. Error: {e}"
                    )
                    errors = errors + ", " + content_name
                else:
                    errors = content_name
                continue
            try:
                language_id = db_model.Language.query.find_language_id_with_name(
                    ip_name=language
                )
            except Exception as e:
                if errors:
                    app_logger.error(
                        f"Exception occurred while fetching language id for adding new contents. Error: {e}"
                    )
                    errors = errors + ", No language named: " + language
                else:
                    errors = "No language named: " + language
                continue
            content_rec = Content(name=content_name)
            db.session.add(content_rec)
            db.session.commit()
            if content_rec.id:
                try:
                    content_version_rec = ContentVersion(
                        content_id=content_rec.id,
                        language_id=language_id,
                        exotel_appid=exotel_appid,
                        duration_secs=duration_secs,
                        status="active",
                        version=1.0,
                    )
                    db.session.add(content_version_rec)
                    db.session.commit()
                except Exception as e:
                    app_logger.error(
                        f"Exception occurred while adding content version. Error message: {e}"
                    )
        return errors
