"""Custom renderer to wrap all API responses in a standard format."""

from rest_framework.renderers import JSONRenderer

from apps.core.messages import get_message
from apps.core.middleware import get_current_language


class StandardResponseRenderer(JSONRenderer):
    """
    Wraps all responses in the format:
    {
        "status": 1,
        "code": 200,
        "message": "...",
        "data": { ... },
        "errors": []
    }
    """

    def render(self, data, accepted_media_type=None, renderer_context=None):
        response = renderer_context.get("response") if renderer_context else None
        request = renderer_context.get("request") if renderer_context else None

        if response is None:
            return super().render(data, accepted_media_type, renderer_context)

        status_code = response.status_code
        is_success = 200 <= status_code < 400

        # Get language from request or fallback to thread-local
        lang = getattr(request, "language", None) if request else None
        if not lang:
            lang = get_current_language()

        if is_success:
            message_key = data.pop("_message", "success") if isinstance(data, dict) else "success"
            wrapped = {
                "status": 1,
                "code": status_code,
                "message": get_message(message_key, lang),
                "data": data,
                "errors": [],
            }
        else:
            # Error response
            errors = []
            if isinstance(data, dict):
                message_key = data.pop("_message", None)
                if not message_key:
                    message_key = data.get("detail", "error")
                # Collect field errors
                for key, value in data.items():
                    if key in ("detail", "_message"):
                        continue
                    if isinstance(value, list):
                        for err in value:
                            errors.append({"field": key, "message": str(err)})
                    else:
                        errors.append({"field": key, "message": str(value)})
            elif isinstance(data, list):
                message_key = "error"
                errors = [{"message": str(e)} for e in data]
            else:
                message_key = str(data)

            wrapped = {
                "status": 0,
                "code": status_code,
                "message": get_message(str(message_key), lang),
                "data": None,
                "errors": errors,
            }

        return super().render(wrapped, accepted_media_type, renderer_context)
