%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Copyright (c) 2012-2015 Kivra
%%%
%%% Permission to use, copy, modify, and/or distribute this software for any
%%% purpose with or without fee is hereby granted, provided that the above
%%% copyright notice and this permission notice appear in all copies.
%%%
%%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
%%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
%%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
%%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
%%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
%%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
%%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
%%%
%%% @doc Erlang OAuth 2.0 implementation
%%% @end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%_* Module declaration ===============================================
-module(oauth2_config).

%%%_* Exports ==========================================================
%%%_ * API -------------------------------------------------------------
-export([backend/0]).
-export([expiry_time/0]).
-export([expiry_time/1]).
-export([token_generation/0]).

%%%_* Macros ===========================================================
%% Default time in seconds before an authentication token expires.
-define(DEFAULT_TOKEN_EXPIRY, 3600).

%%%_* Code =============================================================
%%%_ * API -------------------------------------------------------------
%% @doc Gets the default expiry time for access tokens.
-spec expiry_time() -> non_neg_integer().
expiry_time() -> get_optional(expiry_time, ?DEFAULT_TOKEN_EXPIRY).

%% @doc Gets a specific expiry time for access tokens if available
%%      returns the default if non found
-spec expiry_time(atom()) -> non_neg_integer().
expiry_time(Flow) ->
    case application:get_env(oauth2, Flow) of
        undefined   -> expiry_time();
        {ok, Value} ->
            case lists:keyfind(expiry_time, 1, Value) of
                false       -> expiry_time();
                {_Key, Val} -> Val
            end
    end.

%% @doc Gets the backend for validating passwords, storing tokens, etc.
-spec backend() -> atom().
backend() -> get_required(backend).

%% @doc Gets the backend for generating tokens.
-spec token_generation() -> atom().
token_generation() -> get_optional(token_generation, oauth2_token).

%%%_* Private functions ================================================
get_optional(Key, Default) ->
    case application:get_env(oauth2, Key) of
        undefined   -> Default;
        {ok, Value} -> Value
    end.

get_required(Key) ->
    case application:get_env(oauth2, Key) of
        undefined   -> throw({missing_config, Key});
        {ok, Value} -> Value
    end.

%%%_* Tests ============================================================
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.

%%%_* Emacs ============================================================
%%% Local Variables:
%%% allout-layout: t
%%% erlang-indent-level: 4
%%% End:
