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


class ExperiencePauseLogQuery(BaseQuery):
    def pending_pause_log_exists(self, experience_id):
        epl_count = self.filter(
            ExperiencePauseLog.experience_id == experience_id,
            ExperiencePauseLog.status.in_(
                (ExperiencePauseLog.Status.PENDING, ExperiencePauseLog.Status.ON_PAUSE)
            ),
        ).count()
        return epl_count > 0

    def get_experience_pause_log_to_pause(self):
        experience_pause_logs = self.filter(
            ExperiencePauseLog.status == ExperiencePauseLog.Status.PENDING,
            func.DATE(ExperiencePauseLog.pause_start_date) <= date.today(),
        ).all()

        return experience_pause_logs

    def get_experience_pause_log_to_unpause(self):
        experience_pause_logs = self.filter(
            ExperiencePauseLog.status == ExperiencePauseLog.Status.ON_PAUSE,
            func.DATE(ExperiencePauseLog.end_date) < date.today(),
        ).all()

        return experience_pause_logs

    def get_on_pause_log(self, experience_id):
        return self.filter(
            ExperiencePauseLog.experience_id == experience_id,
            ExperiencePauseLog.status == ExperiencePauseLog.Status.ON_PAUSE,
        ).first()


class ExperiencePauseLog(TimestampMixin, db.Model):
    __tablename__ = "experiencepauselog"
    query_class = ExperiencePauseLogQuery

    class Status:
        PENDING = "pending"
        COMPLETED = "completed"
        ON_PAUSE = "on_pause"

    id = db.Column(db.Integer, primary_key=True)
    experience_id = db.Column(db.Integer, db.ForeignKey("experience.id"))
    pause_start_date = db.Column(db.Date)
    pause_end_date = db.Column(db.Date)
    next_program_id = db.Column(db.Integer, db.ForeignKey("program.id"))
    status = db.Column(db.String(30))
    paused_for_experience_id = db.Column(db.Integer, db.ForeignKey("experience.id"))

    @classmethod
    def add_experience_pause_log(
        cls, experience_id, pause_start_date, pause_end_date, next_program_id, status
    ):
        pause_log = ExperiencePauseLog(
            experience_id=experience_id,
            pause_start_date=pause_start_date,
            pause_end_date=pause_end_date,
            next_program_id=next_program_id,
            status=status,
        )
        db.session.add(pause_log)
        db.session.commit()

    @classmethod
    def delete_experience_pause_log(cls, experience_id):
        pause_log = cls.query.filter_by(experience_id=experience_id).first()
        if pause_log:
            db.session.delete(pause_log)
            db.session.commit()
