"""Tenant + TenantSession DB erişimi. Tenant kök varlık — tenant_id filtresi yok."""
from datetime import UTC, datetime

from fastapi import Depends
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.database import get_db
from app.models.tenant import Tenant, TenantSession


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

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

    async def get_by_email(self, email: str) -> Tenant | None:
        result = await self.db.execute(
            select(Tenant).where(Tenant.email == email)
        )
        return result.scalar_one_or_none()

    async def email_exists(self, email: str) -> bool:
        result = await self.db.execute(
            select(Tenant.id).where(Tenant.email == email)
        )
        return result.scalar_one_or_none() is not None

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

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

    # --- Sessions (JWT revocation) ---

    async def create_session(self, **kwargs) -> TenantSession:
        sess = TenantSession(**kwargs)
        self.db.add(sess)
        await self.db.commit()
        await self.db.refresh(sess)
        return sess

    async def get_session_by_jti(self, jti: str) -> TenantSession | None:
        result = await self.db.execute(
            select(TenantSession).where(TenantSession.jti == jti)
        )
        return result.scalar_one_or_none()

    async def revoke_session(self, session: TenantSession) -> None:
        session.revoked_at = datetime.now(UTC).replace(tzinfo=None)
        await self.db.commit()
