from sqlalchemy.orm import Session
from typing import Optional, List
from .models import Insuranceprovider


def get_by_id(db: Session, entity_id: str) -> Optional[Insuranceprovider]:
    return db.query(Insuranceprovider).filter(Insuranceprovider.id == entity_id).first()


def list_all(db: Session, limit: int = 20, offset: int = 0, **filters) -> List[Insuranceprovider]:
    q = db.query(Insuranceprovider)
    search = filters.get("search")
    if search:
        search_pattern = f"%{search}%"
        q = q.filter(
            (Insuranceprovider.name.ilike(search_pattern)) |
            (Insuranceprovider.contact_person.ilike(search_pattern)) |
            (Insuranceprovider.email.ilike(search_pattern))
        )
    return q.order_by(Insuranceprovider.created_at.desc()).limit(limit).offset(offset).all()


def count_all(db: Session, **filters) -> int:
    q = db.query(Insuranceprovider.id)
    search = filters.get("search")
    if search:
        search_pattern = f"%{search}%"
        q = q.filter(
            (Insuranceprovider.name.ilike(search_pattern)) |
            (Insuranceprovider.contact_person.ilike(search_pattern)) |
            (Insuranceprovider.email.ilike(search_pattern))
        )
    return q.count()


def create(db: Session, data: dict) -> Insuranceprovider:
    instance = Insuranceprovider(**data)
    db.add(instance)
    db.flush()
    return instance


def update(db: Session, entity_id: str, data: dict) -> Optional[Insuranceprovider]:
    instance = get_by_id(db, entity_id)
    if not instance:
        return None
    for key, value in data.items():
        setattr(instance, key, value)
    db.flush()
    return instance


def delete(db: Session, entity_id: str) -> bool:
    instance = get_by_id(db, entity_id)
    if not instance:
        return False
    db.delete(instance)
    db.flush()
    return True