from fastapi import Request, HTTPException
from fastapi.responses import JSONResponse
from .exceptions import APIError
from .error_codes import ERROR_MESSAGES, STATUS_CODES


def _ERROR(error_code: str) -> APIError:
    """
    Глобальна функція для створення помилок
    Аналог твоєї PHP функції $this->_ERROR('ItemNotEmpty')
    """
    status_code = STATUS_CODES.get(error_code, 400)
    raise APIError(error_code=error_code, status_code=status_code)


async def api_error_handler(request: Request, exc: APIError):
    """Handler для обробки APIError"""
    error_message = ERROR_MESSAGES.get(exc.error_code, "Невідома помилка")

    return JSONResponse(
        status_code=exc.status_code,
        content={
            "data": [],
            "status": False,
            "error": error_message
        }
    )


async def http_exception_handler(request: Request, exc: HTTPException):
    """Handler для обробки стандартних HTTPException"""
    return JSONResponse(
        status_code=exc.status_code,
        content={
            "data": [],
            "status": False,
            "error": exc.detail or "HTTP помилка"
        }
    )


async def general_exception_handler(request: Request, exc: Exception):
    """Handler для обробки всіх інших помилок"""
    return JSONResponse(
        status_code=500,
        content={
            "data": [],
            "status": False,
            "error": "Внутрішня помилка сервера"
        }
    )