from rest_framework import status
from rest_framework.response import Response

from django.db import IntegrityError
from django.utils.translation import gettext as _

from misago.users.namechanges import get_username_options
from misago.users.serializers import ChangeUsernameSerializer


def username_endpoint(request):
    if request.method == "POST":
        return change_username(request)
    else:
        options = get_username_options_from_request(request)
        return options_response(options)


def get_username_options_from_request(request):
    return get_username_options(request.settings, request.user, request.user_acl)


def options_response(options):
    if options["next_on"]:
        options["next_on"] = options["next_on"].isoformat()
    return Response(options)


def change_username(request):
    options = get_username_options_from_request(request)
    if not options["changes_left"]:
        return Response(
            {"detail": _("You can't change your username now."), "options": options},
            status=status.HTTP_400_BAD_REQUEST,
        )

    serializer = ChangeUsernameSerializer(
        data=request.data, context={"settings": request.settings, "user": request.user}
    )
    if serializer.is_valid():
        try:
            serializer.change_username(changed_by=request.user)
            updated_options = get_username_options_from_request(request)
            if updated_options["next_on"]:
                updated_options["next_on"] = updated_options["next_on"].isoformat()

            return Response(
                {
                    "username": request.user.username,
                    "slug": request.user.slug,
                    "options": updated_options,
                }
            )
        except IntegrityError:
            return Response(
                {"detail": _("Error changing username. Please try again.")},
                status=status.HTTP_400_BAD_REQUEST,
            )
    else:
        return Response(
            {"detail": serializer.errors["non_field_errors"][0]},
            status=status.HTTP_400_BAD_REQUEST,
        )


def moderate_username_endpoint(request, profile):
    if request.method == "POST":
        serializer = ChangeUsernameSerializer(
            data=request.data, context={"settings": request.settings, "user": profile}
        )

        if serializer.is_valid():
            try:
                serializer.change_username(changed_by=request.user)
                return Response({"username": profile.username, "slug": profile.slug})
            except IntegrityError:
                return Response(
                    {"detail": _("Error changing username. Please try again.")},
                    status=status.HTTP_400_BAD_REQUEST,
                )
        else:
            return Response(
                {"detail": serializer.errors["non_field_errors"][0]},
                status=status.HTTP_400_BAD_REQUEST,
            )
    else:
        return Response(
            {
                "length_min": request.settings.username_length_min,
                "length_max": request.settings.username_length_max,
            }
        )