# frozen_string_literal: true

require 'yaml'
require_relative '../localer/ext/hash'
require_relative 'config/locale'

module Localer # :nodoc:
  using Localer::Ext::Hash

  # Loads and parse Localer config file `.localer.yml`
  class Config
    extend Dry::Initializer

    APP_PATH = Dir.pwd
    CONFIG_FILENAME = ".localer.yml"

    option :exclude, default: -> { [] }
    option :locale, proc { |hash| parse_locales(hash) }, default: -> { Hash.new(Locale.new) }
    option :app_path, default: -> { APP_PATH }

    class << self
      def load(options = {})
        opts = options.deep_symbolize_keys
        app_path = opts.fetch(:app_path, APP_PATH)
        file_options = file_config(CONFIG_FILENAME, app_path)
        new(file_options.deep_merge(opts).deep_symbolize_keys)
      end

      def file_config(filename, path)
        filename = File.expand_path(filename, path)
        return {} unless File.exist?(filename)
        return {} if File.zero?(filename)

        YAML
          .load_file(filename)
          .deep_downcase_keys
          .deep_symbolize_keys
      end

      def parse_locales(hash)
        hash.each_with_object(Hash.new(Locale.new)) do |(l, v), h|
          h[l] = Locale.new(v)
        end
      end
    end
  end
end
