import json
from django.apps import apps
from rest_framework.decorators import api_view
from rest_framework.response import Response
from drf_spectacular.utils import extend_schema, OpenApiParameter
from rest_framework.permissions import AllowAny

from account.tasks import send_email_test_task

@extend_schema(
    tags=["public"],

    description="Vrátí všechny možné hodnoty pro ChoiceField s podporou vícejazyčných labelů. "
                "Umožňuje načíst více modelů a polí najednou.",
    parameters=[
        OpenApiParameter(
            name="fields",
            description=(
                "JSON pole objektů {model: 'ModelName', field: 'field_name'} "
                "např. '[{\"model\": \"User\", \"field\": \"role\"}, {\"model\": \"Carrier\", \"field\": \"shipping_method\"}]'"
            ),
            required=True,
            type=str,
        ),
        OpenApiParameter(
            name="lang",
            description="Jazyk pro labely (např. 'cz', 'en')",
            required=False,
            type=str,
        ),
    ],
    responses={
        200: {
            "type": "object",
            "additionalProperties": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "value": {"type": "string", "description": "Logická hodnota pro backend"},
                        "label": {"type": "string", "description": "Human-readable label podle zvoleného jazyka"}
                    }
                }
            }
        }
    }
)
@api_view(["GET"])
def choices(request):
    """
    Endpoint pro získání choices pro dropdowny s podporou vícejazyčných labelů.
    Formát labelu v modelu: 'lang#Label', např. 'cz#Administrátor'.
    Podporuje více modelů a polí najednou.
    """
    permission_classes = [AllowAny]

    fields_param = request.query_params.get("fields")
    lang = request.query_params.get("lang", None)

    try:
        fields_list = json.loads(fields_param)
    except Exception:
        return Response({"error": "Invalid 'fields' parameter, must be valid JSON"}, status=400)

    result = {}
    for item in fields_list:
        model_name = item.get("model")
        field_name = item.get("field")
        if not model_name or not field_name:
            continue

        model = apps.get_model("app_name", model_name)
        field = model._meta.get_field(field_name)

        choices_data = []
        for value, label in field.choices:
            if "#" in label and lang:
                label_parts = label.split("#", 1)
                if label_parts[0] == lang:
                    label = label_parts[1]
                else:
                    label = label_parts[1]  # fallback na defaultní text (po #)
            elif "#" in label:
                label = label.split("#", 1)[1]
            choices_data.append({"value": value, "label": label})

        result[f"{model_name}.{field_name}"] = choices_data

    return Response(result)



@extend_schema(
    tags=["core", "testing"],
    description="Testovací endpoint pro odeslání testovacího emailu.",
    parameters=[
        OpenApiParameter(
            name="email",
            description="Emailová adresa příjemce testovacího emailu.",
            required=True,
            type=str,
        ),
    ],
)
@api_view(["GET"])
def test_email(request):
    email = request.query_params.get("email")
    send_email_test_task.delay(email)

    return Response({"status": "Test task (celery) email sent, await delivery."})