
EnsureMacro =
  fun(Macro, Value, Config0) ->
          ErlOpts = proplists:get_value(erl_opts, Config0, []),
          ErlOptsCleared =
              lists:filter(fun({d, Macro}) -> false;
                              ({d, Macro, _}) -> false;
                              (_) -> true
                           end, ErlOpts),
          NewErlOpts = [{d, Macro, Value}|ErlOptsCleared],
          lists:keystore(erl_opts, 1, Config0, {erl_opts, NewErlOpts})
  end.

EnvToMacro =
  fun(Name, Config0) ->
          case os:getenv(Name) of
              false ->
                  Config0;
              Env ->
                  EnsureMacro(list_to_atom(Name), list_to_atom(Env), Config0)
          end
  end.

DeleteDep =
  fun(Dep, Config0) ->
          Deps = proplists:get_value(deps, Config0, []),
          DepsCleared = lists:keydelete(Dep, 1, Deps),
          lists:keystore(deps, 1, Config0, {deps, DepsCleared})
  end.

ReplaceDep =
  fun(NewDep, OldDep, Config0) ->
          Deps = proplists:get_value(deps, Config0, []),
          DepsCleared = lists:keydelete(OldDep, 1, Deps),
          NewDeps = [NewDep|DepsCleared],
          lists:keystore(deps, 1, Config0, {deps, NewDeps})
  end.

JsonLib =
  fun(Config0) ->
          case os:getenv("XPROF_JSON_LIB") of
              false ->
                  Config0;
              JsonMod ->
                  Config1 = EnsureMacro("XPROF_JSON_LIB", list_to_atom(JsonMod), Config0),
                  Config2 = EnvToMacro("XPROF_JSON_ENC_FUN", Config1),
                  %% jsone also deleted from .app.src applications
                  DeleteDep(jsone, Config2)
          end
  end.

CowboyVsn =
  fun(Config0) ->
          case os:getenv("COWBOY_VERSION") of
              "1" ++ _ ->
                  Config1 = EnsureMacro('COWBOY_VERSION_1', true, Config0),
                  ReplaceDep({cowboy, "1.1.2"}, cowboy, Config1);
              _ ->
                  Config0
          end
  end.

Rebar2 =
  fun(Config0) ->
          case erlang:function_exported(rebar3, main, 1) of
              true -> % rebar3
                  Config0;
              false -> % rebar 2.x or older
                  %% Only include app names for deps.
                  %% Top level app should declare source and version.
                  Deps = proplists:get_value(deps, Config0, []),
                  NewDeps = [element(1, Dep)||Dep <- Deps],
                  lists:keystore(deps, 1, Config0, {deps, NewDeps})
          end
  end.

Rebar2(CowboyVsn(JsonLib(CONFIG))).
