%%%-------------------------------------------------------------------
%%% @author Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%% @copyright (C) 2013-2016, Evgeniy Khramtsov
%%% @doc
%%%
%%% @end
%%% Created :  1 May 2013 by Evgeniy Khramtsov <ekhramtsov@process-one.net>
%%%-------------------------------------------------------------------

Cfg = case file:consult(filename:join(filename:dirname(SCRIPT), "vars.config")) of
          {ok, Terms} ->
              Terms;
          _Err ->
              []
      end,

ProcessVars = fun(_F, [], Acc) ->
                      lists:reverse(Acc);
                 (F, [{Type, Var, Value} | Tail], Acc) when
                        Type == if_var_true orelse
                        Type == if_var_false ->
                      Flag = Type == if_var_true,
                      case proplists:get_bool(Var, Cfg) of
                          V when V == Flag ->
                              F(F, Tail, [Value | Acc]);
                          _ ->
                              F(F, Tail, Acc)
                      end;
                 (F, [{Type, Var, Match, Value} | Tail], Acc) when
                        Type == if_var_match orelse
                        Type == if_var_no_match ->
                      case proplists:get_value(Var, Cfg) of
                          V when V == Match ->
                              F(F, Tail, [Value | Acc]);
                          _ ->
                              F(F, Tail, Acc)
                      end;
                 (F, [Other1 | Tail1], Acc) ->
                      F(F, Tail1, [F(F, Other1, []) | Acc]);
                 (F, Val, Acc) when is_tuple(Val) ->
                      list_to_tuple(F(F, tuple_to_list(Val), Acc));
                 (_F, Other2, _Acc) ->
                      Other2
              end,

CFLags = proplists:get_value(cflags, Cfg, ""),
CPPFLags = proplists:get_value(cppflags, Cfg, ""),
LDFLags = proplists:get_value(ldflags, Cfg, ""),

ConfigureCmd = fun(Pkg, Flags) ->
                       {'get-deps',
                        "sh -c 'cd deps/" ++ Pkg ++
                            " && CFLAGS=\""++ CFLags ++"\" CPPFLAGS=\""++ CPPFLags ++"\" LDFLAGS=\""++ LDFLags ++"\"" ++
                            " ./configure " ++ Flags ++ "'"}
               end,

Conf = ProcessVars(ProcessVars, CONFIG, []),

Conf1 = case lists:keytake(post_hook_configure, 1, Conf) of
            {value, {_, Items}, Rest} ->
                [{post_hooks, [ConfigureCmd(Mod, string:join(Opts, " ")) || {Mod, Opts} <- Items]} | Rest];
            _ ->
                Conf
        end,

{ok, Cwd} = file:get_cwd(),
TestConfigFile = filename:join([Cwd, "test", "config.ctc"]),
TestConfig = case file:read_file_info(TestConfigFile) of
                 {ok, _} ->
                     "-userconfig ct_config_plain " ++ TestConfigFile ++ " ";
                 _ ->
                     ""
             end,

Conf2 = [{ct_extra_params, "-ct_hooks cth_surefire "
         ++ TestConfig
         ++ "-include "
         ++ filename:join([Cwd, "tools"])} | Conf1],

Conf3 = case lists:keytake(xref_exclusions, 1, Conf2) of
            {value, {_, Items2}, Rest2} ->
                [{xref_queries, [{lists:flatten(["(XC - UC) || (XU - X - B ",
                                                 [[" - ", V] || V <- Items2], ")"]), []}]} | Rest2];
            _ ->
                Conf2
        end,

Conf5 = case lists:keytake(floating_deps, 1, Conf3) of
            {value, {_, FloatingDeps}, Rest4} ->
                case lists:keytake(deps, 1, Rest4) of
                    {value, {_, Deps}, Rest41} ->
                        ND = lists:map(fun({DepName, Ver, {git, Repo, _Commit}}=Dep) ->
                                               case lists:member(DepName, FloatingDeps) of
                                                   true ->
                                                       {DepName, ".*", {git, Repo}};
                                                   _ ->
                                                       Dep
                                               end;
                                          (Dep2) ->
                                               Dep2
                                       end, Deps),
                        [{deps, ND} | Rest41];
                    _ ->
                        Rest4
                end;
            _ ->
                Conf3
        end,

%io:format("ejabberd configuration:~n  ~p~n", [Conf5]),

Conf5.

%% Local Variables:
%% mode: erlang
%% End:
%% vim: set filetype=erlang tabstop=8: