{minimum_otp_vsn, "27"}.

%% Generate partisan-flavoured copies of OTP's `gen_server', `gen_statem',
%% `supervisor', etc. from the INSTALLED OTP source BEFORE partisan's own
%% compile starts. The escript calls `partisan_gen_transform:generate_all/1',
%% which compiles the rewritten forms straight to `partisan_gen_*' BEAMs in
%% partisan's `ebin' (NOT `.erl' sources in `src' — pretty-printing to source
%% would mis-render auto-imported BIFs; see the escript header). This makes the
%% `partisan_gen_*' beams exist by the time any downstream dependency (plum_db,
%% bondy, …) starts compiling against them.
%%
%% A pre-compile hook is required because, when two direct deps of a
%% top-level project both depend on partisan, rebar3 may start the
%% second dep's compile before partisan's post-compile hook fires. See
%% `priv/generate_otp_sources.escript' for details.
{pre_hooks, [
    {compile, "escript priv/generate_otp_sources.escript"}
]}.

{deps, [
        %% Core dependencies
        {uuid, "2.0.5", {pkg, uuid_erl}},
        {types, "~> 0.1.8"},
        {opentelemetry_api, "1.2.1"},
        telemetry,
        %% Exponential backoff for partisan_retry's optional backoff mode.
        {backoff, "1.1.6"}
        %% Applications under test
        %% {hbbft, {git, "git://github.com/helium/erlang-hbbft", {branch, "master"}}}
        %% {riak_ensemble, {git, "git://github.com/cmeiklejohn/riak_ensemble", {branch, "partisan"}}},
        %% {paxoid, {git, "git://github.com/cmeiklejohn/paxoid", {branch, "partisan"}}},
        %% {lashup, {git, "git://github.com/cmeiklejohn/lashup", {branch, "partisan"}}},
        %% {hbbft, {git, "git://github.com/helium/erlang-hbbft", {branch, "master"}}},
        %% {zraft_lib, {git, "git://github.com/cmeiklejohn/zraft_lib", {branch, "master"}}}
       ]}.

{dialyzer, [
    {base_plt_apps, [
        kernel, stdlib, erts, sasl, eunit, syntax_tools, compiler, crypto,
        ssl, public_key, inets
    ]}
]}.
{xref_checks, [undefined_function_calls]}.
{xref_ignores, [
  eredis,
  {partisan_peer_discovery_agent, format_status, 2}
]}.

{cover_enabled, true}.
{cover_opts, [verbose]}.
{cover_export_enabled, true}.
{covertool, [{coverdata_files, ["ct.coverdata"]}]}.

{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.


{erlfmt, [
    write,
    {print_width, 80},
    {exclude_files, []},
    {files, "{src,include,test,examples}/*.{hrl,erl}"}
]}.

{project_plugins, [
    rebar3_proper,
    rebar3_ex_doc,
    rebar3_hex,
    rebar3_hank,
    {erlfmt, "1.8.0"}
]}.

{shell, [
  {erl_opts, [warnings_as_errors]},
  {apps, [partisan]},
  {config, "config/sys.config"}
]}.


{relx, [
    {release, {partisan, "6.0.0"}, [
        %% Erlang
        sasl,
        crypto,
        inets,
        tools,
        runtime_tools,
        os_mon,
        debugger,
        %% Third-parties
        types,
        uuid,
        opentelemetry_api,
        telemetry,
        partisan
    ]},
    {dev_mode, false},
    {include_src, false},
    {include_erts, true},
    {extended_start_script, true},
    {overlay_vars, "config/vars.config"}
]}.

{profiles, [
    {node1, [
        {deps, [
            recon,
            observer_cli
        ]},
        {relx, [
            {dev_mode, false},
            {mode, prod},
            {include_src, false},
            {include_erts, true},
            {sys_config, "config/node1/sys.config"},
            {vm_args, "config/node1/vm.args"},
            {overlay, [
                {mkdir, "{{platform_etc_dir}}"},
                {copy,
                    "config/_ssl/server/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/server/cacerts.pem"
                },
                {copy,
                    "config/_ssl/server/keycert.pem",
                    "{{platform_etc_dir}}/ssl/server/keycert.pem"
                },
                {copy,
                    "config/_ssl/server/key.pem",
                    "{{platform_etc_dir}}/ssl/server/key.pem"
                },
                {copy,
                    "config/_ssl/client/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/client/cacerts.pem"
                },
                {copy,
                    "config/_ssl/client/keycert.pem",
                    "{{platform_etc_dir}}/ssl/client/keycert.pem"
                },
                {copy,
                    "config/_ssl/client/key.pem",
                    "{{platform_etc_dir}}/ssl/client/key.pem"
                }
            ]}
        ]}
    ]},
    {node2, [
        {deps, [
            recon,
            observer_cli
        ]},
        {relx, [
            {dev_mode, false},
            {mode, prod},
            {include_src, false},
            {include_erts, true},
            {sys_config, "config/node2/sys.config"},
            {vm_args, "config/node2/vm.args"},
            {overlay, [
                {mkdir, "etc"},
                {mkdir, "{{platform_etc_dir}}/ssl"},
                {copy,
                    "config/_ssl/server/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/server/cacerts.pem"
                },
                {copy,
                    "config/_ssl/server/keycert.pem",
                    "{{platform_etc_dir}}/ssl/server/keycert.pem"
                },
                {copy,
                    "config/_ssl/server/key.pem",
                    "{{platform_etc_dir}}/ssl/server/key.pem"
                },
                {copy,
                    "config/_ssl/client/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/client/cacerts.pem"
                },
                {copy,
                    "config/_ssl/client/keycert.pem",
                    "{{platform_etc_dir}}/ssl/client/keycert.pem"
                },
                {copy,
                    "config/_ssl/client/key.pem",
                    "{{platform_etc_dir}}/ssl/client/key.pem"
                }
            ]}
        ]}
    ]},
    {node3, [
        {deps, [
            recon,
            observer_cli
        ]},
        {relx, [
            {dev_mode, false},
            {include_src, false},
            {include_erts, true},
            {sys_config, "config/node3/sys.config"},
            {vm_args, "config/node3/vm.args"},
            {overlay, [
                {mkdir, "etc"},
                {mkdir, "{{platform_etc_dir}}/ssl"},
                {copy,
                    "config/_ssl/server/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/server/cacerts.pem"
                },
                {copy,
                    "config/_ssl/server/keycert.pem",
                    "{{platform_etc_dir}}/ssl/server/keycert.pem"
                },
                {copy,
                    "config/_ssl/server/key.pem",
                    "{{platform_etc_dir}}/ssl/server/key.pem"
                },
                {copy,
                    "config/_ssl/client/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/client/cacerts.pem"
                },
                {copy,
                    "config/_ssl/client/keycert.pem",
                    "{{platform_etc_dir}}/ssl/client/keycert.pem"
                },
                {copy,
                    "config/_ssl/client/key.pem",
                    "{{platform_etc_dir}}/ssl/client/key.pem"
                }
            ]}
        ]}
    ]},
    {node4, [
        {deps, [
            recon,
            observer_cli
        ]},
        {relx, [
            {dev_mode, false},
            {include_src, false},
            {include_erts, true},
            {sys_config, "config/node4/sys.config"},
            {vm_args, "config/node4/vm.args"},
            {overlay, [
                {mkdir, "etc"},
                {mkdir, "{{platform_etc_dir}}/ssl"},
                {copy,
                    "config/_ssl/server/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/server/cacerts.pem"
                },
                {copy,
                    "config/_ssl/server/keycert.pem",
                    "{{platform_etc_dir}}/ssl/server/keycert.pem"
                },
                {copy,
                    "config/_ssl/server/key.pem",
                    "{{platform_etc_dir}}/ssl/server/key.pem"
                },
                {copy,
                    "config/_ssl/client/cacerts.pem",
                    "{{platform_etc_dir}}/ssl/client/cacerts.pem"
                },
                {copy,
                    "config/_ssl/client/keycert.pem",
                    "{{platform_etc_dir}}/ssl/client/keycert.pem"
                },
                {copy,
                    "config/_ssl/client/key.pem",
                    "{{platform_etc_dir}}/ssl/client/key.pem"
                }
            ]}
        ]}
    ]},
    {test, [
       {erl_opts, [
          nowarn_export_all,
          nowarn_unused_type,
          nowarn_deprecated_function,
          debug_info
        ]},
        {extra_src_dirs, ["protocols", "test/otp", "bench"]},

        {deps, [
          {eredis,
            {git, "https://github.com/wooga/eredis.git", {tag, "master"}}
          },
          {jsx, "3.1.0"},
          {proper, "1.4.0"},
          recon
        ]},

        {relx, [{release, {partisan, "6.0.0"}, [eredis, partisan]},
               {extended_start_script, true},

               {dev_mode, true},
               {include_erts, false},

               {sys_config, "config/sys.config"},
               {vm_args, "config/vm.args"},

               {overlay, [{mkdir, "log/sasl"},
                          {mkdir, "data/"},
                          {copy, "bin/env", "bin"}
              ]}
        ]}
    ]},
    {lint,  [
        {erl_opts, [
          warnings_as_errors,
          nowarn_export_all,
          nowarn_deprecated_function,
          debug_info
        ]},
        {plugins, [rebar3_lint]}
    ]}
]}.


{hex, [
  {doc, #{provider => ex_doc}}
]}.


{ex_doc, [
  {source_url, <<"https://github.com/lasp-lang/partisan">>},
  {extras, [
    <<"README.md">>,
    <<"doc_extras/installation.md">>,
    <<"doc_extras/migrating_v5_to_v6.md">>,
    <<"doc_extras/cheatsheet.cheatmd">>,
    <<"doc_extras/telemetry.md">>,
    <<"doc_extras/cluster_security.md">>,
    <<"doc_extras/adrs/ADR-000001.md">>,
    <<"doc_extras/adrs/ADR-000002.md">>,
    <<"doc_extras/adrs/ADR-000003.md">>,
    <<"doc_extras/adrs/ADR-000004.md">>,
    <<"doc_extras/adrs/ADR-000005.md">>,
    <<"doc_extras/adrs/ADR-000006.md">>,
    <<"doc_extras/adrs/ADR-000007.md">>,
    <<"CODE_OF_CONDUCT.md">>,
    <<"LICENSE">>,
    <<"CHANGELOG.md">>
  ]},
  {main, <<"README.md">>},
  {logo, "assets/partisan_isotype.png"},
  %% Render ```mermaid fenced blocks as diagrams. Atom `html` key is required
  %% (ex_doc uses the format atom); mermaid.js is loaded from a CDN per page.
  {before_closing_body_tag, #{html => "<script src=\"https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js\"></script><script>document.addEventListener(\"DOMContentLoaded\", function () { mermaid.initialize({startOnLoad: false, theme: document.body.className.includes(\"dark\") ? \"dark\" : \"default\"}); let id = 0; for (const codeEl of document.querySelectorAll(\"pre code.mermaid\")) { const preEl = codeEl.parentElement; const graphDefinition = codeEl.textContent; const graphEl = document.createElement(\"div\"); mermaid.render(\"mermaid-graph-\" + id++, graphDefinition).then(({svg, bindFunctions}) => { graphEl.innerHTML = svg; bindFunctions && bindFunctions(graphEl); preEl.insertAdjacentElement(\"afterend\", graphEl); preEl.remove(); }); } });</script>"}},
  {api_reference, true},
  %% Pages/modules whose doc references are intentionally unresolvable and must
  %% not raise ex_doc "undefined or private" warnings. ex_doc checks each entry
  %% against `config.id`, `config.module_id`, *and* the reference's file path
  %% relative to cwd — for an extra (a Markdown page) only the file path ever
  %% matches, so those two entries must be the source file's relative path, not
  %% a derived slug like "changelog":
  %%   * CHANGELOG.md / cheatsheet.cheatmd — reference functions removed in
  %%     earlier versions and OTP functions (gen_server, erlang, net_kernel)
  %%     shown for comparison;
  %%   * acceptor / acceptor_pool — vendored modules referencing OTP `supervisor`
  %%     and library types;
  %%   * partisan_monitor — references peer-service-manager *callbacks* (on_up/2,
  %%     on_down/2), which are not functions.
  {skip_undefined_reference_warnings_on, [
    <<"CHANGELOG.md">>,
    <<"doc_extras/cheatsheet.cheatmd">>,
    <<"acceptor">>,
    <<"acceptor_pool">>,
    <<"partisan_monitor">>
  ]},
  {groups_for_extras, [
    {<<"Guides">>, [
      <<"doc_extras/installation.md">>,
      <<"doc_extras/migrating_v5_to_v6.md">>,
      <<"doc_extras/cheatsheet.cheatmd">>
    ]},
    {<<"Deployment">>, [
      <<"doc_extras/cluster_security.md">>,
      <<"doc_extras/telemetry.md">>
    ]},
    {<<"Architecture Decision Records">>, [
      <<"doc_extras/adrs/ADR-000001.md">>,
      <<"doc_extras/adrs/ADR-000002.md">>,
      <<"doc_extras/adrs/ADR-000003.md">>,
      <<"doc_extras/adrs/ADR-000004.md">>,
      <<"doc_extras/adrs/ADR-000005.md">>,
      <<"doc_extras/adrs/ADR-000006.md">>,
      <<"doc_extras/adrs/ADR-000007.md">>
    ]}
  ]},
  {groups_for_modules, [
      {<<"API">>, [
        partisan,
        partisan_config,
        partisan_peer_service
      ]},
      {<<"OTP">>, [
        partisan_erpc,
        partisan_gen,
        partisan_gen_event,
        partisan_gen_server,
        partisan_gen_statem,
        partisan_gen_supervisor,
        partisan_monitor,
        partisan_proc_lib,
        partisan_rpc,
        partisan_rpc_backend,
        partisan_sys,
        partisan_test_server
      ]},
      {<<"Peer Discovery Agent">>, [
        partisan_peer_discovery_agent,
        partisan_peer_discovery_list,
        partisan_peer_discovery_dns
      ]},
      {<<"Peer Service (Sampling|Membership)">>, [
        partisan_peer_service,
        partisan_peer_service_manager,
        partisan_peer_service_sup,
        partisan_membership,
        partisan_peer_service_console,
        partisan_peer_service_client,
        partisan_peer_service_server,
        partisan_remote_ref
      ]},
      {<<"Sampling|Membership Protocols">>, [
        partisan_pluggable_peer_service_manager,
        partisan_hyparview_peer_service_manager,
        partisan_client_server_peer_service_manager,
        partisan_static_peer_service_manager
      ]},
      {<<"Pluggable Membership Strategy">>, [
        partisan_membership_set,
        partisan_membership_strategy,
        partisan_full_membership_strategy,
        partisan_scamp_v1_membership_strategy,
        partisan_scamp_v2_membership_strategy
      ]},
      {<<"Gossip-based Broadcast">>, [
        partisan_broadcast,
        partisan_broadcast_engine,
        partisan_plumtree_engine,
        partisan_thicket_engine,
        partisan_plumtree_backend,
        partisan_plumtree_broadcast,
        partisan_plumtree_broadcast_handler,
        partisan_plumtree_util
      ]},
      {<<"Routing Backend">>, [
        partisan_acknowledgement_backend,
        partisan_causality_backend
      ]},
      {<<"Connection Management">>, [
        partisan_peer_connections,
        partisan_peer_socket,
        partisan_acceptor_pool,
        partisan_acceptor_socket_pool_sup,
        partisan_acceptor_socket
      ]},
      {<<"Orchestration">>, [
        partisan_orchestration_strategy,
        partisan_orchestration_backend,
        partisan_compose_orchestration_strategy,
        partisan_kubernetes_orchestration_strategy
      ]},
      {<<"Tracing">>, [
        partisan_trace_file,
        partisan_trace_orchestrator
      ]},
      {<<"Scaffolding">>, [
        partisan_app,
        partisan_sup
      ]},
      {<<"Utils">>, [
        partisan_util,
        partisan_inet,
        partisan_vclock,
        partisan_transform,
        partisan_transformed_module,
        partisan_analysis,
        partisan_logger
      ]},
      {<<"Deprecated">>, [
        partisan_otp_adapter,
        partisan_gen_fsm
      ]}

  ]}
]}.



{elvis,
 [#{dirs => ["src"],
       filter => "*.erl",
       rules => [
                 %% {elvis_style, line_length,
                 %%  #{ignore => [],
                 %%    limit => 80,
                 %%    skip_comments => false}},
                 {elvis_style, no_tabs},
                 {elvis_style, no_trailing_whitespace},
                 {elvis_style, macro_names, #{ignore => []}},
                 %% {elvis_style, macro_module_names},
                 {elvis_style, operator_spaces, #{rules => [{right, ","},
                                                            {right, "++"},
                                                            {left, "++"}]}},
                 %% {elvis_style, nesting_level, #{level => 3}},
                 {elvis_style, god_modules,
                  #{limit => 25,
                    ignore => []}},
                 {elvis_style, no_if_expression},
                 %% {elvis_style, invalid_dynamic_call, #{ignore => []}},
                 {elvis_style, used_ignored_variable},
                 {elvis_style, no_behavior_info},
                 {
                   elvis_style,
                   module_naming_convention,
                   #{regex => "^[a-z]([a-z0-9]*_?)*(_SUITE)?$",
                     ignore => []}
                 },
                 {
                   elvis_style,
                   function_naming_convention,
                   #{regex => "^([a-z][a-z0-9]*_?)*$"}
                 },
                 {elvis_style, state_record_and_type},
                 {elvis_style, no_spec_with_records}
                 %% {elvis_style, dont_repeat_yourself, #{min_complexity => 10}}
                 %% {elvis_style, no_debug_call, #{ignore => []}}
                ]
      },
     #{dirs => ["."],
       filter => "Makefile",
       rules => [{elvis_project, no_deps_master_erlang_mk, #{ignore => []}},
                 {elvis_project, protocol_for_deps_erlang_mk, #{ignore => []}}]
      },
     #{dirs => ["."],
       filter => "rebar.config",
       rules => [{elvis_project, no_deps_master_rebar, #{ignore => []}},
                 {elvis_project, protocol_for_deps_rebar, #{ignore => []}}]
      }
    ]
}.
