%% -*- erlang -*-
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
%   http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

%
% Blacklist some bad releases.
%
{ok, Version} = file:read_file(filename:join(
    [code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"]
)).

% Version may be binary if file has /n at end :(
% there is no string:trim/1 in Erlang 19 :(
VerString = case Version of
    V when is_binary(V) -> string:strip(binary_to_list(V), right, $\n);
    _ -> string:strip(Version, right, $\n)
end.
VerList = lists:map(fun(X) -> {Int, _} = string:to_integer(X), Int end,
    string:tokens(VerString, ".")).

NotSupported = fun(Ver) ->
    io:fwrite("CouchDB does not support this version of Erlang (~p).~n", [Ver]),
    io:fwrite("Check https://docs.couchdb.org/en/latest/whatsnew/index.html for the~n"),
    io:fwrite("latest information on supported releases.~n"),
    case os:getenv("TRAVIS") of
        "true" ->
            io:fwrite("Travis run, ignoring bad release. You have been warned!~n"),
            ok;
        _ -> halt(1)
    end
end.

case VerList of
    [20 | _] = V20 when V20 < [20, 3, 8, 11] -> NotSupported(VerString);
    [20 | _] = V20 when V20 >= [20, 3, 8, 11] -> ok;
    [21, 2] -> NotSupported(VerString);
    [21, 2, N | _] when N < 3 -> NotSupported(VerString);
    [22, 0] -> NotSupported(VerString);
    [22, 0, N | _] when N < 5 -> NotSupported(VerString);
    _ -> ok
end.

% Set the path to the configuration environment generated
% by `./configure`.

COUCHDB_ROOT = filename:dirname(SCRIPT).
os:putenv("COUCHDB_ROOT", COUCHDB_ROOT).

ConfigureEnv = filename:join(COUCHDB_ROOT, "config.erl").
os:putenv("COUCHDB_CONFIG", ConfigureEnv).

CouchConfig = case filelib:is_file(ConfigureEnv) of
    true ->
        {ok, Result} = file:consult(ConfigureEnv),
        Result;
    false ->
        []
end.

os:putenv("COUCHDB_APPS_CONFIG_DIR", filename:join([COUCHDB_ROOT, "rel/apps"])).

SubDirs = [
    %% must be compiled first as it has a custom behavior
    "src/couch_epi",
    "src/couch_log",
    "src/chttpd",
    "src/couch",
    "src/couch_event",
    "src/mem3",
    "src/couch_index",
    "src/couch_mrview",
    "src/couch_replicator",
    "src/couch_plugins",
    "src/couch_pse_tests",
    "src/couch_stats",
    "src/couch_peruser",
    "src/couch_tests",
    "src/ddoc_cache",
    "src/dreyfus",
    "src/fabric",
    "src/global_changes",
    "src/mango",
    "src/rexi",
    "src/setup",
    "rel"
],

DepDescs = [
%% Independent Apps
{config,           "config",           {tag, "2.1.6"}},
{b64url,           "b64url",           {tag, "1.0.1"}},
{ets_lru,          "ets-lru",          {tag, "1.0.0"}},
{khash,            "khash",            {tag, "1.0.1"}},
{snappy,           "snappy",           {tag, "CouchDB-1.0.4"}},
{ioq,              "ioq",              {tag, "2.1.2"}},
{hqueue,           "hqueue",           {tag, "1.0.1"}},
{smoosh,           "smoosh",           {tag, "1.0.1"}},
{ken,              "ken",              {tag, "1.0.5"}},

%% Non-Erlang deps
{docs,             {url, "https://github.com/apache/couchdb-documentation"},
                   {tag, "2.3.0"}, [raw]},
{fauxton,          {url, "https://github.com/apache/couchdb-fauxton"},
                   {tag, "v1.2.2"}, [raw]},
%% Third party deps
{folsom,           "folsom",           {tag, "CouchDB-0.8.3"}},
{hyper,            "hyper",            {tag, "CouchDB-2.2.0-4"}},
{ibrowse,          "ibrowse",          {tag, "CouchDB-4.0.1-1"}},
{jiffy,            "jiffy",            {tag, "CouchDB-0.14.11-2"}},
{mochiweb,         "mochiweb",         {tag, "v2.19.0"}},
{meck,             "meck",             {tag, "0.8.8"}}
],

WithProper = lists:keyfind(with_proper, 1, CouchConfig) == {with_proper, true},

OptionalDeps = case WithProper of
    true ->
        [{proper, {url, "https://github.com/proper-testing/proper"}, {tag, "v1.3"}}];
    false ->
        []
end,

BaseUrl = "https://github.com/apache/",

MakeDep = fun
    ({AppName, {url, Url}, Version}) ->
        {AppName, ".*", {git, Url, Version}};
    ({AppName, {url, Url}, Version, Options}) ->
        {AppName, ".*", {git, Url, Version}, Options};
    ({AppName, RepoName, Version}) ->
        Url = BaseUrl ++ "couchdb-" ++ RepoName ++ ".git",
        {AppName, ".*", {git, Url, Version}};
    ({AppName, RepoName, Version, Options}) ->
        Url = BaseUrl ++ "couchdb-" ++ RepoName ++ ".git",
        {AppName, ".*", {git, Url, Version}, Options}
end,

ErlOpts = case os:getenv("ERL_OPTS") of
    false -> [];
    Opts -> [list_to_atom(O) || O <- string:tokens(Opts, ",")]
end,

AddConfig = [
    {require_otp_vsn, "19|20|21|22"},
    {deps_dir, "src"},
    {deps, lists:map(MakeDep, DepDescs ++ OptionalDeps)},
    {sub_dirs, SubDirs},
    {lib_dirs, ["src"]},
    {erl_opts, [{i, "../"} | ErlOpts]},
    {eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]},
    {plugins, [eunit_plugin]},
    {dialyzer, [
        {plt_location, local},
        {plt_location, COUCHDB_ROOT},
        {plt_extra_apps, [
            asn1, compiler, crypto, inets, kernel, os_mon, runtime_tools,
            sasl, setup, ssl, stdlib, syntax_tools, xmerl]},
        {warnings, [unmatched_returns, error_handling, race_conditions]}]},
    {post_hooks, [{compile, "escript support/build_js.escript"}]}
],

C = lists:foldl(fun({K, V}, CfgAcc) ->
    lists:keystore(K, 1, CfgAcc, {K, V})
end, CONFIG, AddConfig).
