%% -*- 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/ken",
    "src/mango",
    "src/rexi",
    "src/setup",
    "src/smoosh",
    "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"}},

%% 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).
