from typing import Any, Optional, Dict, List
from app.utils.response_helper import ApiResponse

class ApiResponseMixin:
    """
    Mixin class to provide PHP trait-like functionality for API responses.
    This allows controllers to access response methods directly like PHP traits.
    """

    def ok(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send successful response (HTTP 200)."""
        return ApiResponse.ok(data, message, headers)

    def created(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send resource created response (HTTP 201)."""
        return ApiResponse.created(data, message, headers)

    def accepted(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send accepted response (HTTP 202)."""
        return ApiResponse.accepted(data, message, headers)

    def no_content(self, headers: Optional[Dict[str, str]] = None):
        """Send no content response (HTTP 204)."""
        return ApiResponse.no_content(headers)

    def bad_request(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send bad request error (HTTP 400)."""
        return ApiResponse.bad_request(data, message, headers)

    def unauthorized(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send unauthorized error (HTTP 401)."""
        return ApiResponse.unauthorized(data, message, headers)

    def forbidden(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send forbidden error (HTTP 403)."""
        return ApiResponse.forbidden(data, message, headers)

    def not_found(self, data: Optional[Any] = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send not found error (HTTP 404)."""
        return ApiResponse.not_found(data, message, headers)

    def method_not_allowed(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send method not allowed error (HTTP 405)."""
        return ApiResponse.method_not_allowed(data, message, headers)

    def conflict(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send conflict error (HTTP 409)."""
        return ApiResponse.conflict(data, message, headers)

    def unprocessable_entity(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send validation error (HTTP 422)."""
        return ApiResponse.unprocessable_entity(data, message, headers)

    def too_many_requests(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send rate limit error (HTTP 429)."""
        return ApiResponse.too_many_requests(data, message, headers)

    def server_error(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send server error (HTTP 500)."""
        return ApiResponse.server_error(data, message, headers)

    def service_unavailable(self, data: Any = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send service unavailable error (HTTP 503)."""
        return ApiResponse.service_unavailable(data, message, headers)

    def error(self, message: str, code: int, headers: Optional[Dict[str, str]] = None):
        """Send custom error response."""
        return ApiResponse.error(message, code, headers)

    def error_with_message(self, message: str, code: int = 400, headers: Optional[Dict[str, str]] = None):
        """Send error response with fixed message."""
        return ApiResponse.error_with_message(message, code, headers)

    def validation_error(self, message: str, errors: Optional[List[Dict[str, Any]]] = None):
        """Send validation error response with detailed errors."""
        return ApiResponse.validation_error(message, errors)

    def paginated_response(self, data: List[Any], pagination_info: Dict[str, Any], message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send paginated response with metadata."""
        return ApiResponse.paginated_response(data, pagination_info, message, headers)

    def bulk_response(self, results: List[Dict[str, Any]], message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send bulk operation response."""
        return ApiResponse.bulk_response(results, message, headers)

    def no_data_found(self, data: Optional[Any] = None, message: Optional[str] = None, headers: Optional[Dict[str, str]] = None):
        """Send no content found response (HTTP 204)."""
        return ApiResponse.no_data_found(data, message, headers)
