require 'logger'
require 'socket'

module Loga
  class Configuration
    attr_accessor :service_name,
                  :service_version,
                  :device,
                  :sync,
                  :filter_parameters,
                  :level,
                  :host,
                  :enabled,
                  :silence_rails_rack_logger

    attr_reader :logger

    def initialize
      @host              = gethostname
      @device            = nil
      @sync              = true
      @level             = :info
      @filter_parameters = []
      @service_version   = :git

      # Rails specific configuration
      @enabled           = true
      @silence_rails_rack_logger = true
    end

    def initialize!
      @service_name = service_name.to_s.strip
      @service_version = compute_service_version

      initialize_logger
    end

    def configure
      yield self
    end

    private

    def compute_service_version
      RevisionStrategy.call(service_version)
    end

    def initialize_logger
      device.sync = sync

      logger           = Logger.new(device)
      logger.formatter = Formatter.new(
        service_name:    service_name,
        service_version: service_version,
        host:            host,
      )
      logger.level     = constantized_log_level
    rescue
      logger           = Logger.new(STDERR)
      logger.level     = Logger::ERROR
      logger.error 'Loga could not be initialized'
    ensure
      @logger          = TaggedLogging.new(logger)
    end

    def constantized_log_level
      Logger.const_get(level.to_s.upcase)
    end

    def gethostname
      Socket.gethostname
    rescue Exception
      'unknown.host'
    end
  end
end