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

% 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_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, "1.0.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.1"}},
{ioq,              "ioq",              {tag, "1.0.1"}},

%% Non-Erlang deps
{docs,             {url, "https://github.com/apache/couchdb-documentation"},
                   {tag, "2.1.2"}, [raw]},
{fauxton,          {url, "https://github.com/apache/couchdb-fauxton"},
                   {tag, "v1.1.15"}, [raw]},
%% Third party deps
{folsom,           "folsom",           {tag, "CouchDB-0.8.2"}},
{hyper,            "hyper",            {tag, "CouchDB-2.2.0-3"}},
{ibrowse,          "ibrowse",          {tag, "CouchDB-4.0.1"}},
{jiffy,            "jiffy",            {tag, "CouchDB-0.14.11-2"}},
{mochiweb,         "mochiweb",         {tag, "v2.17.0"}},
{meck,             "meck",             {tag, "0.8.8"}},
{bcrypt,           {url, "https://github.com/apache/couchdb-erlang-bcrypt"},
                   {tag, "1.0.2"}},
{triq,             "triq",             {tag, "v1.2.0"}}
],


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"},
    {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, bcrypt, 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).
