import uuid
from typing import Any

from sqlalchemy.ext.asyncio import AsyncSession

from app.core.logging import get_logger
from app.repositories import LogRepository

logger = get_logger("app.events")


class LogType:
    ORDER = "order"
    PAYMENT = "payment"
    WALLET = "wallet"
    FRAGMENT = "fragment"
    ADMIN = "admin"
    SUPPORT = "support"
    ERROR = "error"
    SYSTEM = "system"


class LogService:
    """Writes structured events to the database and the application log file."""

    def __init__(self, session: AsyncSession) -> None:
        self.repo = LogRepository(session)

    async def write(
        self,
        log_type: str,
        event: str,
        message: str = "",
        user_id: uuid.UUID | None = None,
        order_id: uuid.UUID | None = None,
        payment_id: uuid.UUID | None = None,
        data: dict[str, Any] | None = None,
    ) -> None:
        await self.repo.create(
            type=log_type,
            event=event,
            message=message,
            user_id=user_id,
            order_id=order_id,
            payment_id=payment_id,
            data=data or {},
        )
        logger.info("%s | %s | %s | %s", log_type, event, message, data or {})

    async def search(self, page: int, size: int, **filters: Any) -> tuple[list[Any], int]:
        return await self.repo.search(page, size, **filters)
