%% 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-2025 Broadcom. All Rights Reserved. The term Broadcom refers to Broadcom Inc. and/or its subsidiaries.
%%
%% @hidden
-module(ra_sup).
-behaviour(supervisor).

-export([start_link/0]).
-export([init/1]).

-define(TABLES, [ra_state,
                 ra_open_file_metrics,
                 ra_io_metrics
                 ]).

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    _ = [ets:new(Table, [named_table, public, {write_concurrency, true}])
         || Table <- ?TABLES],

    %% configure the logger module from the application config
    Logger = application:get_env(ra, logger_module, logger),
    ok = ra_env:configure_logger(Logger),
    SupFlags = #{strategy => one_for_one, intensity => 1, period => 5},
    RaLogFileMetrics = #{id => ra_metrics_ets,
                         start => {ra_metrics_ets, start_link, []}},
    RaMachineEts = #{id => ra_machine_ets,
                     start => {ra_machine_ets, start_link, []}},
    RaSystemsSup = #{id => ra_systems_sup,
                     type => supervisor,
                     start => {ra_systems_sup, start_link, []}},
    Procs = [RaMachineEts,
             RaLogFileMetrics,
             RaSystemsSup],
    {ok, {SupFlags, Procs}}.
