{erl_opts, [
    debug_info,
    warn_export_vars,
    warn_shadow_vars,
    warn_obsolete_guard,
    {platform_define, "^[0-9]+", namespaced_types}
]}.

%% Include subdirectories for HTTP/3 and QPACK
{src_dirs, ["src", "src/dist", "src/interop", "src/qpack", "src/h3"]}.

{minimum_otp_vsn, "26"}.

{deps, []}.

{profiles, [
    {test, [
        {deps, [
            {proper, "1.4.0"}
        ]},
        {erl_opts, [debug_info, nowarn_export_all]}
    ]},
    {interop_client, [
        {escript_main_app, quic},
        {escript_name, quic_interop_client},
        {escript_emu_args, "%%! -escript main quic_interop_client\n"}
    ]},
    {interop_server, [
        {escript_main_app, quic},
        {escript_name, quic_interop_server},
        {escript_emu_args, "%%! -escript main quic_interop_server\n"}
    ]},
    {h3_client, [
        {escript_main_app, quic},
        {escript_name, quic_h3_client},
        {escript_emu_args, "%%! -escript main quic_h3_client\n"}
    ]},
    {h3_server, [
        {escript_main_app, quic},
        {escript_name, quic_h3_server},
        {escript_emu_args, "%%! -escript main quic_h3_server\n"}
    ]},
    {dist_node, [
        {relx, [
            {release, {quic_node, "0.1.0"}, [
                quic,
                sasl
            ]},
            {mode, prod},
            {include_erts, true},
            {extended_start_script, true},
            {sys_config_src, "config/dist_sys.config.src"},
            {vm_args_src, "config/dist_vm.args.src"}
        ]}
    ]}
]}.

{project_plugins, [
    {rebar3_proper, "~> 0.12"},
    {rebar3_hex, "~> 7.0"},
    {rebar3_ex_doc, "~> 0.2"},
    {rebar3_lint, "~> 5.0"},
    {erlfmt, "~> 1.7"}
]}.

{hex, [
    {doc, ex_doc},
    %% Ship README-referenced assets so the rendered Hex.pm page does
    %% not show a broken image.
    {include_files, ["docs/images/enki-multimedia.svg"]}
]}.

{ex_doc, [
    {source_url, <<"https://github.com/benoitc/erlang_quic">>},
    {extras, [
        <<"README.md">>,
        <<"CHANGELOG.md">>,
        <<"docs/GETTING_STARTED.md">>,
        <<"docs/DEVELOPER_GUIDE.md">>,
        <<"docs/features.md">>,
        <<"docs/DESIGN.md">>,
        <<"docs/SERVER_GUIDE.md">>,
        <<"docs/CLIENT_GUIDE.md">>,
        <<"docs/QUIC_DIST.md">>,
        <<"docs/QLOG_GUIDE.md">>,
        <<"docs/HTTP3.md">>,
        <<"docs/PERFORMANCE.md">>
    ]},
    {groups_for_extras, [
        {<<"Guides">>, [
            <<"docs/GETTING_STARTED.md">>,
            <<"docs/DEVELOPER_GUIDE.md">>,
            <<"docs/CLIENT_GUIDE.md">>,
            <<"docs/SERVER_GUIDE.md">>
        ]},
        {<<"Reference">>, [
            <<"docs/features.md">>,
            <<"docs/DESIGN.md">>,
            <<"docs/PERFORMANCE.md">>
        ]},
        {<<"Advanced">>, [
            <<"docs/QUIC_DIST.md">>,
            <<"docs/QLOG_GUIDE.md">>,
            <<"docs/HTTP3.md">>
        ]}
    ]},
    {main, <<"readme">>},
    {groups_for_modules, [
        {<<"Public API">>, [quic, quic_listener]},
        {<<"Connection">>, [quic_connection, quic_stream]},
        {<<"Protocol">>, [quic_packet, quic_frame, quic_varint]},
        {<<"Cryptography">>, [quic_crypto, quic_tls, quic_keys, quic_aead, quic_hkdf]},
        {<<"Flow Control">>, [quic_flow, quic_cc, quic_loss, quic_ack]},
        {<<"Session">>, [quic_ticket]},
        {<<"Distribution">>, [
            quic_dist,
            quic_dist_controller,
            quic_dist_sup,
            quic_epmd,
            quic_discovery,
            quic_discovery_static,
            quic_discovery_dns,
            quic_dist_tickets
        ]},
        {<<"HTTP/3">>, [
            quic_h3,
            quic_h3_connection,
            quic_h3_frame,
            quic_h3_client,
            quic_h3_server
        ]},
        {<<"QPACK">>, [
            quic_qpack,
            quic_qpack_huffman
        ]},
        {<<"Load Balancer">>, [quic_lb]}
    ]}
]}.

{erlfmt, [
    write,
    {files, [
        "{src,test,include,scripts}/**/*.{hrl,erl,app.src,escript}",
        "src/{qpack,h3}/**/*.{hrl,erl}",
        "erldns.example.config",
        "rebar.config"
    ]}
]}.

{elvis, [
    {config, [
        #{
            files => [
                "src/*.erl",
                "src/dist/**/*.erl",
                "src/interop/**/*.erl",
                "src/qpack/**/*.erl",
                "src/h3/**/*.erl"
            ],
            rules => [
                %% Keep
                {elvis_style, no_macros, disable},
                {elvis_style, state_record_and_type, #{
                    ignore => [
                        quic_dist_controller,
                        quic_dist_tickets,
                        quic_listener,
                        quic_listener_manager,
                        quic_server_registry,
                        quic_connection,
                        quic_h3_connection
                    ]
                }},
                {elvis_style, private_data_types, #{
                    ignore => [
                        quic_keys, quic_loss, quic_packet, quic_ticket, quic_lb, quic, quic_cc
                    ]
                }},
                {elvis_style, no_receive_without_timeout, #{
                    ignore => [quic_dist, quic_dist_controller, quic_interop_server, quic_h3_server]
                }},
                {elvis_style, no_debug_call, #{
                    ignore => [
                        quic_interop_client, quic_interop_server, quic_h3_client, quic_h3_server
                    ]
                }},
                {elvis_style, atom_naming_convention, #{
                    % public_key record field names need this
                    ignore => [quic_dist],
                    regex => "^[a-z](_?[a-zA-Z0-9]+)*(_SUITE)?$"
                }},
                %% Since OTP28
                {elvis_style, prefer_strict_generators, disable},
                %% New in elvis_core 5.x - disable for now
                {elvis_style, prefer_sigils, disable},
                {elvis_style, consistent_ok_error_spec, disable},
                {elvis_style, abc_size, disable},
                {elvis_style, code_complexity, disable},
                {elvis_style, consistent_variable_naming, disable},
                %% Disable rules that are too strict for this codebase
                {elvis_style, no_common_caveats_call, disable},
                {elvis_style, no_init_lists, disable},
                {elvis_style, no_spec_with_records, disable},
                {elvis_style, param_pattern_matching, disable},
                {elvis_style, no_used_ignored_variables, disable},
                {elvis_style, no_throw, #{
                    ignore => [
                        quic_qpack,
                        quic_qpack_huffman,
                        quic_h3_frame,
                        quic_h3_connection
                    ]
                }},
                {elvis_text_style, max_line_length, #{limit => 120}},
                {elvis_style, no_if_expression, #{
                    ignore => [quic_aead, quic_discovery_dns, quic_stream, quic_connection]
                }},
                {elvis_style, no_deep_nesting, #{
                    ignore => [quic_listener, quic_interop_client, quic_connection, quic_h3_client]
                }},
                {elvis_style, variable_naming_convention, #{ignore => [quic_tls]}},
                %% TODO: Per-module ignores; to be fixed later
                {elvis_style, dont_repeat_yourself, #{
                    ignore => [
                        quic_ack,
                        quic_connection,
                        quic_cc,
                        quic_cc_bbr,
                        quic_cc_cubic,
                        quic_cc_newreno,
                        quic_discovery_dns,
                        quic_listener,
                        quic_loss,
                        quic_aead,
                        quic_dist_controller,
                        quic_packet,
                        quic_interop_client,
                        quic_socket,
                        quic_tls,
                        quic_qpack,
                        quic_qpack_huffman,
                        quic_h3_frame,
                        quic_h3_connection
                    ]
                }},
                {elvis_style, max_function_length, #{
                    ignore => [
                        quic_ack,
                        quic_cc,
                        quic_cc_bbr,
                        quic_cc_cubic,
                        quic_cc_newreno,
                        quic_connection,
                        quic_dist,
                        quic_dist_controller,
                        quic_frame,
                        quic_interop_client,
                        quic_lb,
                        quic_listener,
                        quic_loss,
                        quic_packet,
                        quic_pmtu,
                        quic_qlog,
                        quic_socket,
                        quic_stream,
                        quic_sup,
                        quic_tls,
                        quic_qpack,
                        quic_qpack_huffman,
                        quic_h3_frame,
                        quic_h3_connection,
                        quic_h3_client,
                        quic_h3_server
                    ]
                }},
                {elvis_style, no_god_modules, #{
                    limit => 30,
                    ignore => [
                        quic,
                        quic_cc,
                        quic_cc_bbr,
                        quic_cc_cubic,
                        quic_cc_newreno,
                        quic_connection,
                        quic_crypto,
                        quic_stream,
                        quic_dist_controller,
                        quic_qpack,
                        quic_h3,
                        quic_h3_connection
                    ]
                }},
                {elvis_style, max_function_clause_length, #{
                    ignore => [
                        quic_ack,
                        quic_cc,
                        quic_cc_bbr,
                        quic_cc_cubic,
                        quic_cc_newreno,
                        quic_connection,
                        quic_dist,
                        quic_dist_controller,
                        quic_interop_client,
                        quic_lb,
                        quic_listener,
                        quic_packet,
                        quic_pmtu,
                        quic_socket,
                        quic_stream,
                        quic_sup,
                        quic_tls,
                        quic_loss,
                        quic_qpack,
                        quic_h3_connection,
                        quic_h3_client,
                        quic_h3_server
                    ]
                }},
                {elvis_style, max_module_length, #{
                    ignore => [
                        quic_cc_bbr,
                        quic_cc_cubic,
                        quic_cc_newreno,
                        quic_connection,
                        quic_dist,
                        quic_dist_controller,
                        quic_interop_client,
                        quic_listener,
                        quic_loss,
                        quic_socket,
                        quic_tls,
                        quic_qpack,
                        quic_h3_connection
                    ]
                }},
                {elvis_style, max_function_arity, #{
                    ignore => [quic_loss]
                }},
                {elvis_style, max_record_fields, #{
                    ignore => [
                        quic_cc_bbr,
                        quic_cc_cubic,
                        quic_cc_newreno,
                        quic_connection,
                        quic_dist_controller,
                        quic_h3_connection
                    ]
                }},
                {elvis_style, no_catch_expressions, #{
                    ignore => [quic_dist, quic_h3_connection]
                }},
                {elvis_style, simplify_anonymous_functions, #{
                    ignore => [quic_dist]
                }},
                {elvis_style, no_invalid_dynamic_calls, #{
                    ignore => [quic_dist, quic_h3_connection]
                }}
            ],
            ruleset => erl_files
        },
        #{
            files => ["include/*.hrl"],
            ruleset => hrl_files
        },
        #{
            files => ["rebar.config"],
            ruleset => rebar_config
        }
    ]}
]}.

{dialyzer, [
    {warnings, [
        error_handling,
        unknown
    ]},
    {plt_apps, all_deps},
    {plt_extra_apps, [crypto, ssl]}
]}.

{xref_checks, [
    undefined_function_calls,
    undefined_functions,
    deprecated_function_calls,
    deprecated_functions
]}.

%% Ignore unused exports prepared for future use
{xref_ignores, [
    {quic_listener, register_cid, 3},
    {quic_listener, unregister_cid, 2},
    {quic_ticket, create_ticket, 5},
    {quic_ticket, build_new_session_ticket, 1},
    %% Distribution module callbacks (used by Erlang VM)
    {quic_dist, listen, 1},
    {quic_dist, listen, 2},
    {quic_dist, accept, 1},
    {quic_dist, accept_connection, 5},
    {quic_dist, setup, 5},
    {quic_dist, close, 1},
    {quic_dist, select, 1},
    {quic_dist, address, 0},
    {quic_dist, is_node_name, 1},
    {quic_dist, acceptor_loop, 2},
    {quic_dist, do_setup, 6},
    %% EPMD module callbacks
    {quic_epmd, start_link, 0},
    {quic_epmd, register_node, 2},
    {quic_epmd, register_node, 3},
    {quic_epmd, port_please, 2},
    {quic_epmd, port_please, 3},
    {quic_epmd, names, 1},
    {quic_epmd, address_please, 3},
    %% Discovery behaviour callbacks
    {quic_discovery_static, init, 1},
    {quic_discovery_static, register, 3},
    {quic_discovery_static, lookup, 2},
    {quic_discovery_static, list_nodes, 1},
    {quic_discovery_dns, init, 1},
    {quic_discovery_dns, lookup, 2},
    {quic_discovery_dns, list_nodes, 1},
    %% HTTP/3 frame helpers (used by quic_h3_connection)
    {quic_h3_frame, decode_stream_type, 1},
    {quic_h3_frame, is_reserved_frame_type, 1},
    {quic_h3_frame, is_reserved_setting, 1}
]}.

{cover_enabled, true}.
{cover_opts, [verbose]}.
