from typing import Annotated

from django.http import HttpRequest, HttpResponse
from django.utils.translation import gettext as _
from django.utils.translation import override as override_language
from pydantic import StringConstraints

from zerver.lib.exceptions import JsonableError
from zerver.lib.message import access_message
from zerver.lib.message_report import send_message_report
from zerver.lib.response import json_success
from zerver.lib.typed_endpoint import typed_endpoint
from zerver.lib.typed_endpoint_validators import check_string_in_validator
from zerver.models import Realm, UserProfile


@typed_endpoint
def report_message_backend(
    request: HttpRequest,
    user_profile: UserProfile,
    message_id: int,
    *,
    description: Annotated[
        str, StringConstraints(max_length=Realm.MAX_REPORT_MESSAGE_EXPLANATION_LENGTH)
    ] = "",
    report_type: Annotated[str, check_string_in_validator(Realm.REPORT_MESSAGE_REASONS)],
) -> HttpResponse:
    if report_type == "other" and description == "":
        raise JsonableError(_("An explanation is required."))

    if user_profile.realm.moderation_request_channel is None:
        raise JsonableError(_("Message reporting is not enabled in this organization."))

    reported_message = access_message(user_profile, message_id, is_modifying_message=False)
    with override_language(user_profile.realm.default_language):
        send_message_report(
            user_profile,
            user_profile.realm,
            reported_message,
            report_type,
            description,
        )

    return json_success(request)
