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


class ProviderNumberQuery(BaseQuery):
    def find_provider_number_with_phone(self, phone):
        return self.filter(ProviderNumber.phone == phone).first()

    def find_provider_number_with_name(self, name="MAIN_PHONE"):
        return self.filter(ProviderNumber.name == name).first()

    def get_all_phone_names(self):
        return self.filter().order_by(ProviderNumber.id)

    def get_active_provider_number(self, phone):
        return self.filter(
            ProviderNumber.phone == phone,
            ProviderNumber.status == ProviderNumber.Status.ACTIVE,
        ).first()

    def get_active_phones(self):
        return self.filter(
            ProviderNumber.status == ProviderNumber.Status.ACTIVE
        ).order_by(func.lower(ProviderNumber.name))

    def get_live_call_provider_number(self):
        return self.filter(ProviderNumber.name == ProviderNumber.Name.LIVE_CALL).all()

    def get_provider_number_by_partner_id(self, partner_id):
        return self.filter(
            ProviderNumber.partner_id == partner_id,
            ProviderNumber.status == ProviderNumber.Status.ACTIVE,
        ).first()


class ProviderNumber(TimestampMixin, db.Model):
    __tablename__ = "providernumber"
    query_class = ProviderNumberQuery

    class Name:
        MAIN_PHONE_OLD = "MAIN_PHONE_OLD"
        C3_OLD = "C3_OLD"
        C3 = "C3"
        MAIN_PHONE = "MAIN_PHONE"
        LIVE_CALL = "LIVE_CALL"
        TIKTOK = "TIKTOK"

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

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=False)
    phone = db.Column(db.String(20))
    content_id = db.Column(db.Integer, db.ForeignKey("content.id"))
    partner_id = db.Column(db.Integer, db.ForeignKey("partner.id"))
    language_id = db.Column(db.Integer, db.ForeignKey("language.id"))
    status = db.Column(db.String(50), unique=False)

    partner = db.relationship(
        "Partner",
        backref="provider_number",
        primaryjoin="ProviderNumber.partner_id == Partner.id",
    )

    @classmethod
    def add_provider_number(cls, phone, name, content_id, language_id, partner_id):
        existing_provider_number = ProviderNumber.query.find_provider_number_with_phone(
            phone
        )
        if existing_provider_number:
            existing_provider_number.name = name
            existing_provider_number.content_id = content_id
        else:
            provider_number = ProviderNumber(
                phone=phone,
                name=name,
                content_id=content_id,
                language_id=language_id,
                partner_id=partner_id,
                status=ProviderNumber.Status.ACTIVE,
            )
            db.session.add(provider_number)
        db.session.commit()
