%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
%%
%% Copyright (c) 2017-2026 Broadcom. All Rights Reserved. The term Broadcom
%% refers to Broadcom Inc. and/or its subsidiaries.
-module(ra_log_snapshot_state).

-export([
         insert/5,
         delete/2,
         smallest/2,
         live_indexes/2,
         snapshot/2,
         read/2
        ]).

-spec insert(ets:table(), ra:uid(), -1 | ra:index(), ra:index(), ra_seq:state()) ->
    ok.
insert(Table, UId, SnapIdx, SmallestIdx, LiveIndexes)
  when is_binary(UId) andalso
       is_integer(SnapIdx) andalso
       is_integer(SmallestIdx) andalso
       is_list(LiveIndexes) ->
    true = ets:insert(Table, {UId, SnapIdx, SmallestIdx, LiveIndexes}),
    ok.

delete(Table, UId) ->
    true = ets:delete(Table, UId),
    ok.

-spec smallest(ets:table(), ra:uid()) ->
    ra:index().
smallest(Table, UId) when is_binary(UId) ->
    ets:lookup_element(Table, UId, 3, 0).

-spec live_indexes(ets:table(), ra:uid()) ->
    ra_seq:state().
live_indexes(Table, UId) when is_binary(UId) ->
    ets:lookup_element(Table, UId, 4, []).

-spec snapshot(ets:table(), ra:uid()) ->
    ra:index() | -1.
snapshot(Table, UId) when is_binary(UId) ->
    ets:lookup_element(Table, UId, 2, -1).

-spec read(ets:table(), ra:uid()) ->
    undefined |
    {UId :: ra:uid(),
     SnapIdx :: -1 | ra:index(),
     SmallestIdx :: ra:index(),
     LiveIndexes :: ra_seq:state()}.
read(Table, UId) when is_binary(UId) ->
    case ets:lookup(Table, UId) of
        [] ->
            undefined;
        [Record] ->
            Record
    end.

%%% ===================
%%% Internal unit tests
%%% ===================

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

basics_test() ->

    UId = atom_to_binary(?FUNCTION_NAME, utf8),
    T = ets:new(?FUNCTION_NAME, [set]),
    ok = insert(T, UId, 50, 51, []),
    ?assertEqual(51, smallest(T, UId)),
    ?assertEqual(50, snapshot(T, UId)),
    ok.

-endif.
