class Envirobly::Config

def append_image_tags!

def append_image_tags!
  @project.fetch("services", {}).each do |logical_id, service|
    next if NON_BUILDABLE_TYPES.include?(service["type"]) || service["image_uri"]
    dockerfile = service.fetch("dockerfile", "Dockerfile")
    build_context = service.fetch("build_context", ".")
    @project["services"][logical_id]["image_tag"] = Digest::SHA1.hexdigest [
      git_path_checksums_at_commit(dockerfile),
      git_path_checksums_at_commit(build_context)
    ].to_json
  end
end

def config_content_at_commit

def config_content_at_commit
  `git show #{@commit.ref}:#{path}`
end

def dig(*args)

def dig(*args)
  @project.dig *args
rescue NoMethodError
  nil
end

def git_path_checksums_at_commit(path)

def git_path_checksums_at_commit(path)
  `git ls-tree #{@commit.ref} --format='%(objectname) %(path)' #{path}`.
    lines.reject { _1.split(" ").last == DIR }
end

def initialize(commit)

def initialize(commit)
  @commit = commit
  @parsing_error = nil
  @project = parse_config_content_at_commit
  if @project
    transform_env_var_values!
    append_image_tags!
  end
end

def parse_config_content_at_commit

def parse_config_content_at_commit
  YAML.load config_content_at_commit, aliases: true
rescue Psych::Exception => exception
  @parsing_error = exception.message
  nil
end

def parsing_error?

def parsing_error?
  !@parsing_error.nil?
end

def path

def path
  PATH
end

def to_h

def to_h
  @project
end

def transform_env_var_values!

def transform_env_var_values!
  @project.fetch("services", {}).each do |logical_id, service|
    service.fetch("env", {}).each do |key, value|
      if value.is_a?(Hash) && value.has_key?("file")
        @project["services"][logical_id]["env"][key] = File.read value.fetch("file")
      end
    end
  end
end