%% MLX Erlang - Enhanced Project Configuration
{erl_opts, [
    debug_info,
    warn_export_vars,
    warn_shadow_vars,
    warn_obsolete_guard,
    warn_unused_import,
    {parse_transform, lager_transform}
]}.

%% Dependencies
{deps, [
    {jsx, "3.1.0"},           % JSON encoding/decoding
    {lager, "3.9.2"}          % Logging framework
]}.

%% Plugins
{plugins, [
    {pc, "1.14.0"},           % Port compiler for NIFs
    rebar3_format,            % Code formatting
    rebar3_lint,              % Linting
    rebar3_hex,               % Hex.pm publishing
    rebar3_edoc               % Documentation generation
]}.

%% Project plugins for documentation
{project_plugins, [rebar3_ex_doc]}.

%% Hex configuration with documentation provider
{hex, [{doc, ex_doc}]}.

%% Ex_doc configuration
{ex_doc, [
    {source_url, <<"https://github.com/arthurcolle/mlx.erl">>},
    {extras, [<<"README.md">>]},
    {main, <<"readme">>}
]}.

%% Provider hooks for NIF compilation
{provider_hooks, [
    {pre, [
        {compile, {pc, compile}},
        {clean, {pc, clean}}
    ]}
]}.

%% Port compiler configuration
{port_specs, [
    {"priv/mlx_nif.so", [
        "c_src/mlx_nif.cpp"
    ]},
    {"priv/mlx_random_nif.so", [
        "c_src/mlx_random_nif.cpp"
    ]},
    {"priv/mlx_fft_nif.so", [
        "c_src/mlx_fft_nif.cpp"
    ]},
    {"priv/mlx_linalg_nif.so", [
        "c_src/mlx_linalg_nif.cpp"
    ]}
    % Temporarily disabled - needs API fixes
    % {"priv/mlx_advanced_nif.so", [
    %     "c_src/mlx_advanced_nif.cpp"
    % ]},
    % Temporarily disabled - needs API fixes
    % {"priv/mlx_io_nif.so", [
    %     "c_src/mlx_io_nif.cpp"
    % ]},
    % Temporarily disabled - needs API fixes (no mlx/nn.h)
    % {"priv/mlx_nn_nif.so", [
    %     "c_src/mlx_nn_nif.cpp"
    % ]},
    % Temporarily disabled - needs API fixes (no mlx/optimizers.h)
    % {"priv/mlx_optimizers_nif.so", [
    %     "c_src/mlx_optimizers_nif.cpp"
    % ]},
    % Temporarily disabled - needs API fixes
    % {"priv/mlx_streaming_nif.so", [
    %     "c_src/mlx_streaming_nif.cpp"
    % ]},
    % Temporarily disabled - needs API fixes
    % {"priv/mlx_transforms_nif.so", [
    %     "c_src/mlx_transforms_nif.cpp"
    % ]}
    % Note: Currently only compiling core NIFs that work with this MLX version
]}.

{port_env, [
    %% Compiler flags
    {"CXXFLAGS", "$CXXFLAGS -std=c++17 -O3 -Wall -Wextra"},
    
    %% Include paths
    {"darwin", "CXXFLAGS", "$CXXFLAGS -I/opt/homebrew/include"},
    {"linux", "CXXFLAGS", "$CXXFLAGS -I/usr/local/include"},
    
    %% Library paths and linking
    {"darwin", "LDFLAGS", "$LDFLAGS -L/opt/homebrew/lib -lmlx -framework Accelerate -framework Metal -framework MetalKit -framework MetalPerformanceShaders -framework Foundation -undefined dynamic_lookup"},
    {"linux", "LDFLAGS", "$LDFLAGS -L/usr/local/lib -lmlx"}
]}.

%% EUnit configuration
{eunit_opts, [
    verbose,
    {report, {eunit_surefire, [{dir, "_build/test/logs"}]}}
]}.

%% Common Test configuration
{ct_opts, [
    {sys_config, "config/test.config"},
    {logdir, "_build/test/logs"},
    {suites, test, all}
]}.

%% Code coverage
{cover_enabled, true}.
{cover_opts, [verbose]}.

%% Dialyzer configuration
{dialyzer, [
    {warnings, [
        unknown,
        no_return,
        error_handling,
        race_conditions,
        behaviours
    ]},
    {plt_apps, top_level_deps},
    {plt_extra_apps, [jsx, lager]},
    {plt_location, local},
    {base_plt_apps, [erts, kernel, stdlib]},
    {base_plt_location, global}
]}.

%% Profiles
{profiles, [
    {test, [
        {erl_opts, [debug_info, export_all]},
        {deps, [
            {proper, "1.4.0"},
            {meck, "0.9.2"}
        ]}
    ]},
    {prod, [
        {erl_opts, [debug_info, no_debug_info, warnings_as_errors]},
        {relx, [{dev_mode, false}, {include_erts, true}]}
    ]}
]}.

%% Release configuration
{relx, [
    {release, {mlx, "1.0.0"}, [mlx, sasl]},
    {dev_mode, true},
    {include_erts, false},
    {extended_start_script, true}
]}.

%% Shell configuration
{shell, [
    {apps, [mlx]},
    {config, "config/sys.config"}
]}.