%% -*- 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);
    _ -> 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).

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_index",
    "src/couch_mrview",
    "src/couch_replicator",
    "src/couch_plugins",
    "src/couch_pse_tests",
    "src/couch_event",
    "src/couch_stats",
    "src/couch_peruser",
    "src/couch_tests",
    "src/ddoc_cache",
    "src/fabric",
    "src/global_changes",
    "src/mango",
    "src/mem3",
    "src/rexi",
    "src/setup",
    "rel"
],

DepDescs = [
%% Independent Apps
{config,           "config",           {tag, "2.1.4"}},
{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.2"}},
{ioq,              "ioq",              {tag, "1.0.1"}},

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


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, "17|18|19|20|21"},
    {deps_dir, "src"},
    {deps, lists:map(MakeDep, DepDescs)},
    {sub_dirs, SubDirs},
    {lib_dirs, ["src"]},
    {erl_opts, [{i, "../"} | ErlOpts]},
    {eunit_opts, [verbose]},
    {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).
