  Copyright ( c ) 2011 Basho Technologies , Inc.   All Rights Reserved .
%%
  This file is provided to you 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
%%
%%   -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.

%% @doc Lager's top level supervisor.

  @private

-module(lager_sup).

-behaviour(supervisor).

%% API
-export([start_link/0]).

%% Callbacks
-export([init/1]).

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    Children = [
        {lager, {gen_event, start_link, [{local, lager_event}]},
            permanent, 5000, worker, [dynamic]},
        {lager_handler_watcher_sup, {lager_handler_watcher_sup, start_link, []},
            permanent, 5000, supervisor, [lager_handler_watcher_sup]}],

    %% check if the crash log is enabled
    Crash = case application:get_env(lager, crash_log) of
        {ok, undefined} ->
            [];
        {ok, File} ->
            MaxBytes = case application:get_env(lager, crash_log_msg_size) of
                {ok, Val} when is_integer(Val) andalso Val > 0 -> Val;
                _ -> 65536
            end,
            RotationSize = case application:get_env(lager, crash_log_size) of
                {ok, Val1} when is_integer(Val1) andalso Val1 >= 0 -> Val1;
                _ -> 0
            end,
            RotationCount = case application:get_env(lager, crash_log_count) of
                {ok, Val2} when is_integer(Val2) andalso Val2 >=0 -> Val2;
                _ -> 0
            end,
            RotationDate = case application:get_env(lager, crash_log_date) of
                {ok, Val3} ->
                    case lager_util:parse_rotation_date_spec(Val3) of
                        {ok, Spec} -> Spec;
                        {error, _} when Val3 == "" -> undefined; %% blank is ok
                        {error, _} ->
                            error_logger:error_msg("Invalid date spec for "
                                "crash log ~p~n", [Val3]),
                            undefined
                    end;
                _ -> undefined
            end,

            [{lager_crash_log, {lager_crash_log, start_link, [File, MaxBytes,
                        RotationSize, RotationDate, RotationCount]},
                    permanent, 5000, worker, [lager_crash_log]}];
        _ ->
            []
    end,

    {ok, {{one_for_one, 10, 60},
            Children ++ Crash
            }}.


 Version 2.0 (the "License"); you may not use this file
 a copy of the License at

   -2.0

 Unless required by applicable law or agreed to in writing,
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 @doc Lager's top level supervisor.
 API
 Callbacks
 check if the crash log is enabled
 blank is ok
  Copyright ( c ) 2011 Basho Technologies , Inc.   All Rights Reserved .
  This file is provided to you under the Apache License ,
  except in compliance with the License .   You may obtain
  software distributed under the License is distributed on an
  " AS IS " BASIS , WITHOUT WARRANTIES OR CONDITIONS OF ANY


  @private

-module(lager_sup).

-behaviour(supervisor).

-export([start_link/0]).

-export([init/1]).

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    Children = [
        {lager, {gen_event, start_link, [{local, lager_event}]},
            permanent, 5000, worker, [dynamic]},
        {lager_handler_watcher_sup, {lager_handler_watcher_sup, start_link, []},
            permanent, 5000, supervisor, [lager_handler_watcher_sup]}],

    Crash = case application:get_env(lager, crash_log) of
        {ok, undefined} ->
            [];
        {ok, File} ->
            MaxBytes = case application:get_env(lager, crash_log_msg_size) of
                {ok, Val} when is_integer(Val) andalso Val > 0 -> Val;
                _ -> 65536
            end,
            RotationSize = case application:get_env(lager, crash_log_size) of
                {ok, Val1} when is_integer(Val1) andalso Val1 >= 0 -> Val1;
                _ -> 0
            end,
            RotationCount = case application:get_env(lager, crash_log_count) of
                {ok, Val2} when is_integer(Val2) andalso Val2 >=0 -> Val2;
                _ -> 0
            end,
            RotationDate = case application:get_env(lager, crash_log_date) of
                {ok, Val3} ->
                    case lager_util:parse_rotation_date_spec(Val3) of
                        {ok, Spec} -> Spec;
                        {error, _} ->
                            error_logger:error_msg("Invalid date spec for "
                                "crash log ~p~n", [Val3]),
                            undefined
                    end;
                _ -> undefined
            end,

            [{lager_crash_log, {lager_crash_log, start_link, [File, MaxBytes,
                        RotationSize, RotationDate, RotationCount]},
                    permanent, 5000, worker, [lager_crash_log]}];
        _ ->
            []
    end,

    {ok, {{one_for_one, 10, 60},
            Children ++ Crash
            }}.
