from django.http import HttpRequest, HttpResponse
from django.utils.timezone import now as timezone_now
from pydantic import Json, NonNegativeInt

from zerver.actions.reminders import do_delete_reminder, schedule_reminder_for_message
from zerver.lib.exceptions import DeliveryTimeNotInFutureError
from zerver.lib.reminders import access_reminder
from zerver.lib.request import RequestNotes
from zerver.lib.response import json_success
from zerver.lib.timestamp import timestamp_to_datetime
from zerver.lib.typed_endpoint import PathOnly, typed_endpoint
from zerver.models import UserProfile


@typed_endpoint
def create_reminders_message_backend(
    request: HttpRequest,
    user_profile: UserProfile,
    *,
    message_id: Json[int],
    scheduled_delivery_timestamp: Json[int],
    note: str | None = None,
) -> HttpResponse:
    deliver_at = timestamp_to_datetime(scheduled_delivery_timestamp)
    if deliver_at <= timezone_now():
        raise DeliveryTimeNotInFutureError

    client = RequestNotes.get_notes(request).client
    assert client is not None

    reminder_id = schedule_reminder_for_message(
        user_profile,
        client,
        message_id,
        deliver_at,
        note=note or "",
    )
    return json_success(request, data={"reminder_id": reminder_id})


@typed_endpoint
def delete_reminder(
    request: HttpRequest,
    user_profile: UserProfile,
    *,
    reminder_id: PathOnly[NonNegativeInt],
) -> HttpResponse:
    reminder = access_reminder(user_profile, reminder_id)
    do_delete_reminder(user_profile, reminder)
    return json_success(request)
