from sqlalchemy.orm import Session

from app.core.security import get_password_hash, verify_password
from app.models.agency import Agency
from app.models.user import User
from app.models.enums import UserRole


class UserRepository:
    def __init__(self, db: Session):
        self.db = db

    def get_by_email(self, email: str) -> User | None:
        return self.db.query(User).filter(User.email == email, User.deleted_at.is_(None)).first()

    def get_by_id(self, user_id: int) -> User | None:
        return self.db.query(User).filter(User.id == user_id, User.deleted_at.is_(None)).first()

    def create(self, agency_id: int, email: str, full_name: str, password: str, role: UserRole) -> User:
        user = User(
            agency_id=agency_id,
            email=email,
            full_name=full_name,
            hashed_password=get_password_hash(password),
            role=role,
        )
        self.db.add(user)
        self.db.flush()
        return user


class AgencyRepository:
    def __init__(self, db: Session):
        self.db = db

    def get_by_id(self, agency_id: int) -> Agency | None:
        return self.db.query(Agency).filter(Agency.id == agency_id).first()

    def create(self, name: str, phone: str | None = None, email: str | None = None) -> Agency:
        agency = Agency(name=name, phone=phone, email=email)
        self.db.add(agency)
        self.db.flush()
        return agency

    def get_by_name(self, name: str) -> Agency | None:
        return self.db.query(Agency).filter(Agency.name == name).first()
