"""BaseRepository — tenant_id zorunlu CRUD. Her metot tenant filtresi alır."""
from datetime import UTC, datetime
from typing import Generic, TypeVar

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

from app.database import Base, get_db

T = TypeVar("T", bound=Base)


class BaseRepository(Generic[T]):
    model: type[T]

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

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

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

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

    async def delete(self, obj: T) -> None:
        await self.db.delete(obj)
        await self.db.commit()

    async def soft_delete(self, obj: T) -> None:
        obj.deleted_at = datetime.now(UTC).replace(tzinfo=None)  # type: ignore[attr-defined]
        await self.db.commit()
