from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from sqlalchemy import func
from utils.helpers.helpers import get_current_isttime
from dostadmin import db
from dostadmin.mixins import TimestampMixin


class PreCalculatedUserCampaignDataQuery(BaseQuery):
    def get_details_by_id(self, pre_calculated_user_campaign_data_id):
        return self.filter(
            PreCalculatedUserCampaignData.id == pre_calculated_user_campaign_data_id
        ).first()

    def get_data_by_experience_id(self, experience_id):
        return self.filter(
            PreCalculatedUserCampaignData.experience_id == experience_id
        ).first()

    def get_all_records_by_eligibility(self, is_eligible=True):
        return self.filter(
            PreCalculatedUserCampaignData.is_eligible_to_call == is_eligible
        ).all()

    def get_today_nudge_calls(self):
        today = get_current_isttime().date()
        return self.filter(
            func.DATE(PreCalculatedUserCampaignData.previous_nudge_call_deploy_time)
            == today
        ).all()

    def get_today_blast_calls(self):
        today = get_current_isttime().date()
        return self.filter(
            func.DATE(PreCalculatedUserCampaignData.previous_blast_call_deploy_time)
            == today
        ).all()

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


class CustomizedUserCampaignData:
    def __init__(
        self,
        exp_id,
        phone,
        program_id,
        language_id,
        timecategory_id,
        provider_number,
        experience_type,
        experience_status,
        current_content_id,
        current_content_version_id,
        next_content_id,
        next_content_version_id,
    ):
        self.exp_id = exp_id
        self.phone = phone
        self.program_id = program_id
        self.language_id = language_id
        self.timecategory_id = timecategory_id
        self.provider_number = provider_number
        self.experience_type = experience_type
        self.experience_status = experience_status
        self.current_content_id = current_content_id
        self.current_content_version_id = current_content_version_id
        self.next_content_id = next_content_id
        self.next_content_version_id = next_content_version_id


class PreCalculatedUserCampaignData(TimestampMixin, db.Model):
    __tablename__ = "pre_calculated_user_campaign_data"
    query_class = PreCalculatedUserCampaignDataQuery

    class Status:
        ACTIVE = "active"
        COMPLETED = "completed"

    id = db.Column(db.Integer, primary_key=True)
    call_details_for_date = db.Column(db.Date)
    experience_id = db.Column(db.Integer, db.ForeignKey("experience.id"), unique=True)
    is_eligible_to_call = db.Column(db.Boolean)
    previous_content_id = db.Column(db.Integer, db.ForeignKey("content.id"))
    previous_content_version_id = db.Column(
        db.Integer, db.ForeignKey("content_version.id")
    )
    today_content_id = db.Column(db.Integer, db.ForeignKey("content.id"))
    today_content_version_id = db.Column(
        db.Integer, db.ForeignKey("content_version.id")
    )
    previous_regular_campaign_id = db.Column(db.Integer)
    previous_missed_call_campaign_id = db.Column(db.Integer)
    previous_blast_campaign_id = db.Column(db.Integer)
    previous_nudge_campaign_id = db.Column(db.Integer)
    previous_campaign_name = db.Column(db.String(100))
    previous_blast_campaign_name = db.Column(db.String(100))
    previous_nudge_campaign_name = db.Column(db.String(100))
    previous_blast_call_deploy_time = db.Column(db.DateTime)
    previous_missed_call_deploy_time = db.Column(db.DateTime)
    previous_regular_call_deploy_time = db.Column(db.DateTime)
    previous_nudge_call_deploy_time = db.Column(db.DateTime)
    previous_regular_campaign_status = db.Column(db.String(30))
    previous_missed_call_campaign_status = db.Column(db.String(30))
    previous_blast_call_campaign_status = db.Column(db.String(30))
    previous_nudge_campaign_status = db.Column(db.String(30))
    previous_blast_content_id = db.Column(db.Integer, db.ForeignKey("content.id"))
    previous_nudge_content_id = db.Column(db.Integer, db.ForeignKey("content.id"))
    previous_blast_content_version_id = db.Column(
        db.Integer, db.ForeignKey("content_version.id")
    )
    previous_nudge_content_version_id = db.Column(
        db.Integer, db.ForeignKey("content_version.id")
    )
    max_retry_flag = db.Column(db.Integer, nullable=False, server_default="0")

    @classmethod
    def mark_non_eligible_to_call(cls, pre_calculated_user_campaign_data):
        pre_calculated_user_campaign_data.is_eligible_to_call = False
        db.session.commit()

    @classmethod
    def mark_eligible_to_call(cls, pre_calculated_user_campaign_data):
        pre_calculated_user_campaign_data.is_eligible_to_call = True
        db.session.commit()

    @classmethod
    def delete_pre_calculated_data_for_experience_id(cls, exp_id):
        try:
            pre_calculated_data = cls.query.filter_by(experience_id=exp_id).first()
            db.session.delete(pre_calculated_data)
            db.session.commit()
            return True
        except Exception as e:
            return str(e)
