from sqlalchemy.orm import Session

from app.models.insurance_company import InsuranceCompany
from app.models.whatsapp_log import WhatsAppLog


class InsuranceCompanyRepository:
    def __init__(self, db: Session):
        self.db = db

    def list_active(self) -> list[InsuranceCompany]:
        return (
            self.db.query(InsuranceCompany)
            .filter(InsuranceCompany.is_active.is_(True))
            .order_by(InsuranceCompany.name.asc())
            .all()
        )

    def list_all(self) -> list[InsuranceCompany]:
        return self.db.query(InsuranceCompany).order_by(InsuranceCompany.name.asc()).all()

    def get_by_name_exact(self, name: str) -> InsuranceCompany | None:
        return self.db.query(InsuranceCompany).filter(InsuranceCompany.name == name.strip()).first()

    def get_by_code(self, code: str) -> InsuranceCompany | None:
        return self.db.query(InsuranceCompany).filter(InsuranceCompany.code == code).first()

    def get_by_id(self, company_id: int) -> InsuranceCompany | None:
        return self.db.query(InsuranceCompany).filter(InsuranceCompany.id == company_id).first()

    def find_by_name(self, name: str) -> InsuranceCompany | None:
        pattern = f"%{name.strip()}%"
        return (
            self.db.query(InsuranceCompany)
            .filter(InsuranceCompany.name.ilike(pattern))
            .order_by(InsuranceCompany.name.asc())
            .first()
        )


class WhatsAppLogRepository:
    def __init__(self, db: Session):
        self.db = db

    def create(self, data: dict) -> WhatsAppLog:
        log = WhatsAppLog(**data)
        self.db.add(log)
        self.db.flush()
        return log

    def list_by_policy(self, policy_id: int) -> list[WhatsAppLog]:
        return (
            self.db.query(WhatsAppLog)
            .filter(WhatsAppLog.policy_id == policy_id)
            .order_by(WhatsAppLog.created_at.desc())
            .all()
        )

    def get_by_external_message_id(self, external_message_id: str) -> WhatsAppLog | None:
        return (
            self.db.query(WhatsAppLog)
            .filter(WhatsAppLog.external_message_id == external_message_id)
            .first()
        )
