src/datastar_gleam@event.erl

-module(datastar_gleam@event).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/datastar_gleam/event.gleam").
-export([new_elements/1, new_remove/1, with_id/2, with_retry/2, with_selector/2, with_mode/2, with_use_view_transition/2, patch_elements_to_datastar_event/1, new_signals/1, with_signals_id/2, with_signals_retry/2, with_only_if_missing/2, patch_signals_to_datastar_event/1, new_script/1, with_script_id/2, with_script_retry/2, with_auto_remove/2, with_attributes/2, execute_script_to_datastar_event/1]).
-export_type([patch_elements/0, patch_signals/0, execute_script/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

-type patch_elements() :: {patch_elements,
        gleam@option:option(binary()),
        integer(),
        gleam@option:option(binary()),
        gleam@option:option(binary()),
        datastar_gleam@consts:element_patch_mode(),
        boolean()}.

-type patch_signals() :: {patch_signals,
        gleam@option:option(binary()),
        integer(),
        binary(),
        boolean()}.

-type execute_script() :: {execute_script,
        gleam@option:option(binary()),
        integer(),
        binary(),
        gleam@option:option(boolean()),
        list(binary())}.

-file("src/datastar_gleam/event.gleam", 44).
?DOC(
    " Create a `PatchElements` builder that inserts the given HTML fragment.\n"
    "\n"
    " ```gleam\n"
    " let patch =\n"
    "   event.new_elements(\"<div id='message'>Hello!</div>\")\n"
    "   |> event.with_selector(\"#target\")\n"
    "   |> event.with_mode(event.Append)\n"
    " ```\n"
).
-spec new_elements(binary()) -> patch_elements().
new_elements(Html) ->
    {patch_elements, none, 1000, {some, Html}, none, outer, false}.

-file("src/datastar_gleam/event.gleam", 57).
?DOC(
    " Create a `PatchElements` builder that removes the element matched by\n"
    " `selector`.\n"
).
-spec new_remove(binary()) -> patch_elements().
new_remove(Selector) ->
    {patch_elements, none, 1000, none, {some, Selector}, remove, false}.

-file("src/datastar_gleam/event.gleam", 69).
?DOC(" Set the SSE event ID.\n").
-spec with_id(patch_elements(), binary()) -> patch_elements().
with_id(P, Id) ->
    {patch_elements,
        {some, Id},
        erlang:element(3, P),
        erlang:element(4, P),
        erlang:element(5, P),
        erlang:element(6, P),
        erlang:element(7, P)}.

-file("src/datastar_gleam/event.gleam", 74).
?DOC(" Set the SSE retry duration in milliseconds.\n").
-spec with_retry(patch_elements(), integer()) -> patch_elements().
with_retry(P, Retry) ->
    {patch_elements,
        erlang:element(2, P),
        Retry,
        erlang:element(4, P),
        erlang:element(5, P),
        erlang:element(6, P),
        erlang:element(7, P)}.

-file("src/datastar_gleam/event.gleam", 79).
?DOC(" Set the CSS selector that identifies the target element.\n").
-spec with_selector(patch_elements(), binary()) -> patch_elements().
with_selector(P, Selector) ->
    {patch_elements,
        erlang:element(2, P),
        erlang:element(3, P),
        erlang:element(4, P),
        {some, Selector},
        erlang:element(6, P),
        erlang:element(7, P)}.

-file("src/datastar_gleam/event.gleam", 84).
?DOC(" Set the insertion mode (default `Outer`).\n").
-spec with_mode(patch_elements(), datastar_gleam@consts:element_patch_mode()) -> patch_elements().
with_mode(P, Mode) ->
    {patch_elements,
        erlang:element(2, P),
        erlang:element(3, P),
        erlang:element(4, P),
        erlang:element(5, P),
        Mode,
        erlang:element(7, P)}.

-file("src/datastar_gleam/event.gleam", 89).
?DOC(" Enable or disable view transitions.\n").
-spec with_use_view_transition(patch_elements(), boolean()) -> patch_elements().
with_use_view_transition(P, Enabled) ->
    {patch_elements,
        erlang:element(2, P),
        erlang:element(3, P),
        erlang:element(4, P),
        erlang:element(5, P),
        erlang:element(6, P),
        Enabled}.

-file("src/datastar_gleam/event.gleam", 94).
?DOC(" Convert a `PatchElements` builder into a `DatastarEvent`.\n").
-spec patch_elements_to_datastar_event(patch_elements()) -> datastar_gleam:datastar_event().
patch_elements_to_datastar_event(P) ->
    Data = [],
    Data@1 = case erlang:element(5, P) of
        {some, Sel} ->
            lists:append(
                Data,
                [<<<<"selector"/utf8, " "/utf8>>/binary, Sel/binary>>]
            );

        none ->
            Data
    end,
    Data@2 = case erlang:element(6, P) of
        outer ->
            Data@1;

        _ ->
            lists:append(
                Data@1,
                [<<<<"mode"/utf8, " "/utf8>>/binary,
                        (datastar_gleam@consts:element_patch_mode_string(
                            erlang:element(6, P)
                        ))/binary>>]
            )
    end,
    Data@3 = case erlang:element(7, P) of
        true ->
            lists:append(Data@2, [<<"useViewTransition"/utf8, " True"/utf8>>]);

        false ->
            Data@2
    end,
    Data@4 = case erlang:element(4, P) of
        {some, El} ->
            _pipe = gleam@string:split(El, <<"\n"/utf8>>),
            _pipe@1 = gleam@list:map(
                _pipe,
                fun(Line) ->
                    <<<<"elements"/utf8, " "/utf8>>/binary, Line/binary>>
                end
            ),
            lists:append(Data@3, _pipe@1);

        none ->
            Data@3
    end,
    {datastar_event,
        patch_elements,
        erlang:element(2, P),
        erlang:element(3, P),
        Data@4}.

-file("src/datastar_gleam/event.gleam", 146).
?DOC(
    " Create a `PatchSignals` builder with the given JSON-encoded signals.\n"
    "\n"
    " ```gleam\n"
    " let patch =\n"
    "   event.new_signals(\"{ \\\"count\\\": 42 }\")\n"
    "   |> event.with_only_if_missing(True)\n"
    " ```\n"
).
-spec new_signals(binary()) -> patch_signals().
new_signals(Signals) ->
    {patch_signals, none, 1000, Signals, false}.

-file("src/datastar_gleam/event.gleam", 156).
?DOC(" Set the SSE event ID.\n").
-spec with_signals_id(patch_signals(), binary()) -> patch_signals().
with_signals_id(P, Id) ->
    {patch_signals,
        {some, Id},
        erlang:element(3, P),
        erlang:element(4, P),
        erlang:element(5, P)}.

-file("src/datastar_gleam/event.gleam", 161).
?DOC(" Set the SSE retry duration in milliseconds.\n").
-spec with_signals_retry(patch_signals(), integer()) -> patch_signals().
with_signals_retry(P, Retry) ->
    {patch_signals,
        erlang:element(2, P),
        Retry,
        erlang:element(4, P),
        erlang:element(5, P)}.

-file("src/datastar_gleam/event.gleam", 166).
?DOC(" Only patch signals that are not already present in the frontend store.\n").
-spec with_only_if_missing(patch_signals(), boolean()) -> patch_signals().
with_only_if_missing(P, Only_if_missing) ->
    {patch_signals,
        erlang:element(2, P),
        erlang:element(3, P),
        erlang:element(4, P),
        Only_if_missing}.

-file("src/datastar_gleam/event.gleam", 171).
?DOC(" Convert a `PatchSignals` builder into a `DatastarEvent`.\n").
-spec patch_signals_to_datastar_event(patch_signals()) -> datastar_gleam:datastar_event().
patch_signals_to_datastar_event(P) ->
    Data = [],
    Data@1 = case erlang:element(5, P) of
        true ->
            lists:append(Data, [<<"onlyIfMissing"/utf8, " True"/utf8>>]);

        false ->
            Data
    end,
    Data@2 = begin
        _pipe = gleam@string:split(erlang:element(4, P), <<"\n"/utf8>>),
        _pipe@1 = gleam@list:map(
            _pipe,
            fun(Line) ->
                <<<<"signals"/utf8, " "/utf8>>/binary, Line/binary>>
            end
        ),
        lists:append(Data@1, _pipe@1)
    end,
    {datastar_event,
        patch_signals,
        erlang:element(2, P),
        erlang:element(3, P),
        Data@2}.

-file("src/datastar_gleam/event.gleam", 213).
?DOC(
    " Create an `ExecuteScript` builder with the given JavaScript source.\n"
    "\n"
    " ```gleam\n"
    " let script =\n"
    "   event.new_script(\"console.log('Hello from Gleam!')\")\n"
    "   |> event.with_auto_remove(True)\n"
    " ```\n"
).
-spec new_script(binary()) -> execute_script().
new_script(Script) ->
    {execute_script, none, 1000, Script, none, []}.

-file("src/datastar_gleam/event.gleam", 224).
?DOC(" Set the SSE event ID.\n").
-spec with_script_id(execute_script(), binary()) -> execute_script().
with_script_id(S, Id) ->
    {execute_script,
        {some, Id},
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S)}.

-file("src/datastar_gleam/event.gleam", 229).
?DOC(" Set the SSE retry duration in milliseconds.\n").
-spec with_script_retry(execute_script(), integer()) -> execute_script().
with_script_retry(S, Retry) ->
    {execute_script,
        erlang:element(2, S),
        Retry,
        erlang:element(4, S),
        erlang:element(5, S),
        erlang:element(6, S)}.

-file("src/datastar_gleam/event.gleam", 234).
?DOC(" Automatically remove the `<script>` tag after it executes.\n").
-spec with_auto_remove(execute_script(), boolean()) -> execute_script().
with_auto_remove(S, Auto_remove) ->
    {execute_script,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        {some, Auto_remove},
        erlang:element(6, S)}.

-file("src/datastar_gleam/event.gleam", 239).
?DOC(" Add extra attributes to the generated `<script>` tag.\n").
-spec with_attributes(execute_script(), list(binary())) -> execute_script().
with_attributes(S, Attributes) ->
    {execute_script,
        erlang:element(2, S),
        erlang:element(3, S),
        erlang:element(4, S),
        erlang:element(5, S),
        Attributes}.

-file("src/datastar_gleam/event.gleam", 288).
-spec append_to_last(list(binary()), binary()) -> list(binary()).
append_to_last(Items, Suffix) ->
    case lists:reverse(Items) of
        [Last | Front] ->
            lists:reverse([<<Last/binary, Suffix/binary>> | Front]);

        [] ->
            []
    end.

-file("src/datastar_gleam/event.gleam", 247).
?DOC(" Convert an `ExecuteScript` builder into a `DatastarEvent`.\n").
-spec execute_script_to_datastar_event(execute_script()) -> datastar_gleam:datastar_event().
execute_script_to_datastar_event(S) ->
    Data = [<<"selector"/utf8, " body"/utf8>>],
    Data@1 = lists:append(
        Data,
        [<<<<"mode"/utf8, " "/utf8>>/binary,
                (datastar_gleam@consts:element_patch_mode_string(append))/binary>>]
    ),
    Script_tag = begin
        Auto_remove_attr = case erlang:element(5, S) of
            {some, false} ->
                <<""/utf8>>;

            _ ->
                <<" data-effect=\"el.remove()\""/utf8>>
        end,
        Attrs = gleam@string:join(erlang:element(6, S), <<" "/utf8>>),
        Attr_str = case Attrs of
            <<""/utf8>> ->
                <<""/utf8>>;

            _ ->
                <<" "/utf8, Attrs/binary>>
        end,
        <<<<<<"<script"/utf8, Auto_remove_attr/binary>>/binary,
                Attr_str/binary>>/binary,
            ">"/utf8>>
    end,
    Lines = gleam@string:split(erlang:element(4, S), <<"\n"/utf8>>),
    {First, Rest} = case Lines of
        [F | R] ->
            {F, R};

        [] ->
            {<<""/utf8>>, []}
    end,
    First_el = <<<<<<"elements"/utf8, " "/utf8>>/binary, Script_tag/binary>>/binary,
        First/binary>>,
    Rest_els = gleam@list:map(
        Rest,
        fun(L) -> <<<<"elements"/utf8, " "/utf8>>/binary, L/binary>> end
    ),
    All_els = [First_el | Rest_els],
    All_els@1 = append_to_last(All_els, <<"</script>"/utf8>>),
    Data@2 = lists:append(Data@1, All_els@1),
    {datastar_event,
        patch_elements,
        erlang:element(2, S),
        erlang:element(3, S),
        Data@2}.