from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from sqlalchemy import desc
from dostadmin import db
from dostadmin.mixins import TimestampMixin


class MissedCallLogQuery(BaseQuery):
    def get_by_id(self, missed_call_log_id):
        return self.filter(MissedCallLog.id == missed_call_log_id).first()

    def get_latest_missedcall_for_phone(self, phone_number):
        return (
            self.filter(MissedCallLog.phone == phone_number)
            .order_by(desc(MissedCallLog.id))
            .first()
        )


class MissedCallAction:
    def __init__(self, data):
        self.campaign_action = data.get("campaign_action")
        self.campaign_object = data.get("campaign_object")
        self.missed_call_status = data.get("missed_call_status")


class CustomizedMissedCall:
    def __init__(self, data):
        self.missed_call_id = data.get("missed_call_id")
        self.missed_call_status = data.get("missed_call_status")
        self.experience_id = data.get("experience_id")
        self.phone = data.get("phone")
        self.created_on = data.get("created_on")
        self.start_time = data.get("start_time")
        self.program_id = data.get("program_id")
        self.user_id = data.get("user_id")
        self.start_date = data.get("start_date")
        self.time = data.get("time")
        self.exotelnumber = data.get("exotelnumber")
        self.experience_status = data.get("experience_status")
        self.experience_type = data.get("experience_type")


class MissedCallLog(TimestampMixin, db.Model):
    __tablename__ = "engagement"
    query_class = MissedCallLogQuery

    class MissedCallStatus:
        TO_SCHEDULE = "to_schedule"
        SCHEDULED = "scheduled"
        IGNORED = "ignored"

        CHOICES = (
            (TO_SCHEDULE, "To Schedule"),
            (SCHEDULED, "Scheduled"),
        )

    id = db.Column(db.String(100), primary_key=True)
    direction = db.Column(db.String(50))
    exotelnumber = db.Column(db.String(20))
    phone = db.Column(db.String(20))
    status = db.Column(db.String(50))
    start_time = db.Column(db.DateTime)
    end_time = db.Column(db.DateTime)
    listen_secs = db.Column(db.Integer)
    price = db.Column(db.Float)
    user_circle = db.Column(db.String(10))
    exo_circle = db.Column(db.String(10))
    experience_id = db.Column(db.Integer, db.ForeignKey("experience.id"))
    missed_call_status = db.Column(db.String(30))
    campaign_id = db.Column(db.Integer)

    def __repr__(self):
        return (
            "\n Engagement: id_ "
            + str(self.id)
            + ", phone: "
            + str(self.phone)
            + ", Status: "
            + self.missed_call_status
        )

    @classmethod
    def get_latest_missedcalllog_for_experience(cls, experience):
        return (
            MissedCallLog.query.filter(MissedCallLog.experience_id == experience.id)
            .order_by(desc(MissedCallLog.start_time))
            .first()
        )

    @classmethod
    def delete_missed_calls_for_phone(cls, user_phone):
        try:
            missed_call_logs = cls.query.filter_by(phone=user_phone).all()
            for missed_call in missed_call_logs:
                db.session.delete(missed_call)
            db.session.commit()
        except Exception as e:
            return str(e)
