"""Ziyaretçi DB erişimi. Her sorgu tenant_id filtreli — cross-tenant sızıntı yasak."""
from fastapi import Depends
from sqlalchemy import or_, select
from sqlalchemy.ext.asyncio import AsyncSession

from app.database import get_db
from app.models.visitor import FlovyVisitor


class VisitorRepository:
    def __init__(self, db: AsyncSession = Depends(get_db)):
        self.db = db

    async def get(self, visitor_id: str, tenant_id: str) -> FlovyVisitor | None:
        result = await self.db.execute(
            select(FlovyVisitor).where(
                FlovyVisitor.id == visitor_id,
                FlovyVisitor.tenant_id == tenant_id,
            )
        )
        return result.scalar_one_or_none()

    async def get_by_uuid(self, tenant_id: str, visitor_uuid: str) -> FlovyVisitor | None:
        result = await self.db.execute(
            select(FlovyVisitor).where(
                FlovyVisitor.tenant_id == tenant_id,
                FlovyVisitor.visitor_uuid == visitor_uuid,
            )
        )
        return result.scalar_one_or_none()

    async def get_by_fingerprint(
        self, tenant_id: str, fingerprint_hash: str
    ) -> FlovyVisitor | None:
        result = await self.db.execute(
            select(FlovyVisitor)
            .where(
                FlovyVisitor.tenant_id == tenant_id,
                FlovyVisitor.fingerprint_hash == fingerprint_hash,
            )
            .order_by(FlovyVisitor.created_at.asc())
        )
        return result.scalars().first()

    async def find_by_email_or_phone(
        self, tenant_id: str, email: str | None, phone: str | None
    ) -> FlovyVisitor | None:
        if not email and not phone:
            return None
        conds = []
        if email:
            conds.append(FlovyVisitor.email == email)
        if phone:
            conds.append(FlovyVisitor.phone == phone)
        result = await self.db.execute(
            select(FlovyVisitor).where(
                FlovyVisitor.tenant_id == tenant_id, or_(*conds)
            )
        )
        return result.scalars().first()

    async def create(self, **kwargs) -> FlovyVisitor:
        visitor = FlovyVisitor(**kwargs)
        self.db.add(visitor)
        await self.db.commit()
        await self.db.refresh(visitor)
        return visitor

    async def update(self, visitor: FlovyVisitor, **kwargs) -> FlovyVisitor:
        for key, value in kwargs.items():
            setattr(visitor, key, value)
        await self.db.commit()
        await self.db.refresh(visitor)
        return visitor

    async def delete(self, visitor: FlovyVisitor) -> None:
        await self.db.delete(visitor)
        await self.db.commit()
