from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from datetime import datetime, timedelta
from dostadmin import db
from dostadmin.mixins import TimestampMixin
from utils.helpers import helpers


class CronExecutionLogQuery(BaseQuery):
    def get_old_cron_records(self, days):
        days_ago = datetime.now() - timedelta(days=days)
        old_records = CronExecutionLog.query.filter(
            CronExecutionLog.start_time < days_ago
        ).all()
        return old_records

    def get_regular_cron_execution_log_by_datetime_and_status(
        self, current_datetime, status
    ):
        return (
            db.session.query(CronExecutionLog)
            .filter(
                CronExecutionLog.start_time == current_datetime,
                CronExecutionLog.name
                == CronExecutionLog.CronNames.CRON_SCHEDULER_REGULAR,
                CronExecutionLog.status == status,
            )
            .first()
        )


class CronExecutionLog(TimestampMixin, db.Model):
    __tablename__ = "cron_execution_log"
    query_class = CronExecutionLogQuery

    class CronRunStatus:
        PENDING = "pending"
        IN_PROGRESS = "in-progress"
        COMPLETED = "completed"
        FAILED = "failed"

    class CronNames:
        CRON_SCHEDULER_REGULAR = "campaign_scheduler_regular"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    start_time = db.Column(db.DateTime)
    end_time = db.Column(db.DateTime)
    status = db.Column(db.String(30))

    @classmethod
    def delete_old_cron_logs(cls, days):
        old_cron_logs = CronExecutionLog.query.get_old_cron_records(days)
        if old_cron_logs:
            for old_cron_log in old_cron_logs:
                db.session.delete(old_cron_log)
            db.session.commit()

    @classmethod
    def update_cron_log_status(cls, cron_log, status):
        cron_log.status = status
        if status == CronExecutionLog.CronRunStatus.COMPLETED:
            cron_log.end_time = helpers.get_current_isttime()
        db.session.commit()
