from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from dostadmin import db, app_logger
from dostadmin.mixins import TimestampMixin


class IvrPromptMappingQuery(BaseQuery):
    def get_by_id(self, ivr_prompt_mapping_id):
        return self.filter(IvrPromptMapping.id == ivr_prompt_mapping_id).first()

    def get_all_prompt_mapping(self, current_page):
        return self.order_by(IvrPromptMapping.id).paginate(
            page=current_page, per_page=30, error_out=True
        )

    def get_active_mapping_for_ivr_prompt_id(self, ivr_prompt_id):
        return self.filter_by(
            ivr_prompt_id=ivr_prompt_id, status=IvrPromptMapping.Status.ACTIVE
        ).all()


class IvrPromptMapping(TimestampMixin, db.Model):
    __tablename__ = "ivr_prompt_mapping"
    query_class = IvrPromptMappingQuery

    class Status:
        ACTIVE = "active"
        INACTIVE = "inactive"

    id = db.Column(db.Integer, primary_key=True)
    ivr_prompt_id = db.Column(db.Integer, db.ForeignKey("ivrprompt.id"))
    mapped_table_name = db.Column(db.String(100))
    mapped_table_column_name = db.Column(db.String(100))
    value = db.Column(db.String(100))
    status = db.Column(db.String(100))

    ivr_prompt = db.relationship(
        "IVRPrompt",
        back_populates="ivr_prompt_mapping",
        primaryjoin="IvrPromptMapping.ivr_prompt_id == IVRPrompt.id",
        lazy=True,
        uselist=False,
    )

    @classmethod
    def update_prompts(cls, prompt_data):
        app_logger.info("Updating prompts %s", prompt_data)
        prompt_mapping_id = int(prompt_data[0])
        mapped_table = prompt_data[1]
        mapped_column = prompt_data[2]
        value = prompt_data[3]
        ivr_prompt_rec = IvrPromptMapping.query.get_by_id(prompt_mapping_id)
        ivr_prompt_rec.mapped_table_name = mapped_table
        ivr_prompt_rec.mapped_table_column_name = mapped_column
        ivr_prompt_rec.value = value
        db.session.commit()

    @classmethod
    def add_new_mapping(cls, ivr_prompts):
        for prompts in ivr_prompts:
            app_logger.info("Adding prompt mapping %s", prompts)
            errors = []
            event_id = int(prompts[0])
            mapped_table = prompts[1]
            mapped_column = prompts[2]
            value = prompts[3]

            prompt_rec = IvrPromptMapping(
                ivr_prompt_id=event_id,
                mapped_table_name=mapped_table,
                mapped_table_column_name=mapped_column,
                value=value,
                status=IvrPromptMapping.Status.ACTIVE,
            )
            try:
                db.session.add(prompt_rec)
                db.session.commit()
            except Exception as e:
                errors.append(e)
        return errors
