module Enviro
  module Logger

    class DirectoryNotFound < StandardError; end

    def self.included(base)
      base.send(:extend, ClassMethods)
      base.instance_eval do
        class << self
          extend Forwardable
          def_delegators :logger, :debug, :error, :fatal, :info, :warn
        end
      end
    end

    module ClassMethods

      def logger_dir_env(value=nil)
        @_logger_dir_env ||= 'ENVIRO_LOG_DIR'
        @_logger_dir_env = value.to_s.upcase unless value.nil?
        @_logger_dir_env
      end

      def logger_dir
        @_logger_dir ||= ENV[self.logger_dir_env]
      end

      def logger
        @_logger ||= _setup_logger_for_environment
      end

      private

        def _setup_logger_for_environment
          return ::Rails.logger if defined?(::Rails)
          unless self.logger_dir.nil?
            raise DirectoryNotFound unless File::directory?(self.logger_dir)
            @logger_path = File.join(self.logger_dir, "#{self.environment}.log")
          else
            @logger_path = STDOUT
          end
          require 'logger'
          return ::Logger.new(@logger_path)
        end
    end

  end
end