CREATE OR REPLACE FUNCTION public.archive_alert(p_id integer)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
    v_archived_alert_id INTEGER;
BEGIN
    -- Insert the selected alert into the archived_alert table
    INSERT INTO archived_alert (
      "alert_id",
      "user_id",
      "phone_number_id",
      "device_id",
      "location",
      "alert_tag",
      "created_at",
      "call_emergency",
      "notify_around",
      "notify_relatives",
      "level",
      "subject",
      "accuracy",
      "altitude",
      "altitude_accuracy",
      "heading",
      "speed",
      "radius",
      "address",
      "what3words",
      "nearest_place",
      "uuid",
      "code",
      "notified_count",
      "closed_at",
      "keep_open_at",
      "updated_at",
      "suggest_close_sent",
      "suggest_keep_open_sent",
      "closed_by"
    )
    SELECT 
      "id", 
      "user_id",
      "phone_number_id",
      "device_id",
      "location",
      "alert_tag",
      "created_at",
      "call_emergency",
      "notify_around",
      "notify_relatives",
      "level",
      "subject",
      "accuracy",
      "altitude",
      "altitude_accuracy",
      "heading",
      "speed",
      "radius",
      "address",
      "what3words",
      "nearest_place",
      "uuid",
      "code",
      "notified_count",
      "closed_at",
      "keep_open_at",
      "updated_at",
      "suggest_close_sent",
      "suggest_keep_open_sent",
      "closed_by"
    FROM "alert"
    WHERE "id" = p_id
    RETURNING "id" INTO v_archived_alert_id;

    -- Insert related alerted records into the archived_alerted table
    INSERT INTO
        "alerted" (
            "archived_alert_id",
            "user_id",
            "opened_once",
            "created_at",
            "near_location",
            "opened",
            "device_id",
            "initial_location",
            "notification_sent",
            "notification_sent_at",
            "initial_distance",
            "geomatch_method",
            "reason",
            "updated_at",
            "coming_help",
            "relative_user_id"
        )
    SELECT
        v_archived_alert_id,
        "user_id",
        "opened_once",
        "created_at",
        "near_location",
        "opened",
        "device_id",
        "initial_location",
        "notification_sent",
        "notification_sent_at",
        "initial_distance",
        "geomatch_method",
        "reason",
        "updated_at",
        "coming_help",
        "relative_user_id"
    FROM "alerting"
    WHERE "alert_id" = p_id;
    
    -- Insert related messages into the archived_message table
    INSERT INTO archived_message (
        "archived_alert_id",
        "user_id",
        "device_id",
        "content_type",
        "text",
        "audio_file_uuid",
        "location",
        "created_at"
    )
    SELECT
        v_archived_alert_id,
        "user_id",
        "device_id",
        "content_type",
        "text",
        "audio_file_uuid",
        "location",
        "created_at"
    FROM "message"
    WHERE "alert_id" = p_id;

    -- Delete the messages from the message table
    DELETE FROM "message"
    WHERE "alert_id" = p_id;
    
    -- Delete the alert from the alert table
    DELETE FROM "alert"
    WHERE id = p_id;

END;
$function$;
