require "tempfile"
require "yaml"

module Govuk
  module Lint
    class ConfigFile
      CONFIG_PATH = File.expand_path("../../../configs", __dir__)
      BASE_CONFIG_FILE = File.join(CONFIG_PATH, "rubocop/all.yml")

      def config_file_path
        return BASE_CONFIG_FILE unless File.exist?(local_config_file_path)

        tempfile_for_configs.path
      end

    private

      def merged_global_and_local_configs
        config = load_global_config
        config["inherit_from"] = absolutize_paths(config)
        config["inherit_from"] << local_config_file_path
        config
      end

      def load_global_config
        YAML.load_file(BASE_CONFIG_FILE)
      end

      def absolutize_paths(config)
        config["inherit_from"].map do |filename|
          File.join(CONFIG_PATH, "rubocop/#{filename}")
        end
      end

      def local_config_file_path
        @local_config_file_path ||= File.join(Dir.pwd, ".rubocop.yml")
      end

      def tempfile_for_configs
        @tempfile_for_configs ||= begin
                                   file = Tempfile.new("tmp-rubocop-all.yml")
                                   file.write(merged_global_and_local_configs.to_yaml)
                                   file.close
                                   file
                                 end
      end
    end
  end
end
