from typing import Optional
from uuid import UUID

from sqlalchemy.ext.asyncio import AsyncSession

from src.apps.site_admin.models.audit_log import AuditLog


class AuditService:
    @staticmethod
    async def log(
        db: AsyncSession,
        entity_type: str,
        entity_id: UUID,
        action: str,
        user,
        request,
        old_value: Optional[dict] = None,
        new_value: Optional[dict] = None,
    ) -> None:
        entry = AuditLog(
            tenant_id=getattr(user, 'tenant_id', None),
            user_id=user.id,
            entity_type=entity_type,
            entity_id=entity_id,
            action=action,
            old_value=old_value,
            new_value=new_value,
            ip_address=str(request.client.host) if request.client else None,
            user_agent=request.headers.get('user-agent'),
        )
        db.add(entry)
        await db.flush()
