class Chef::Knife::EnvironmentCompare

def constraint_list(environments)

def constraint_list(environments)
  constraints = {}
  environments.each do |env, url| # rubocop:disable Style/HashEachMethods

    # Because you cannot modify the default environment I filter it out here.

    unless env == "_default"
      envdata = Chef::Environment.load(env)
      ver = envdata.cookbook_versions
      constraints[env] = ver
    end
  end
  constraints
end

def cookbook_list(constraints)

def cookbook_list(constraints)
  result = {}
  constraints.each_value { |cb| result.merge!(cb) }
  result
end

def environment_list

def environment_list
  environments = []
  unless @name_args.nil? || @name_args.empty?
    @name_args.each { |name| environments << name }
  else
    environments = Chef::Environment.list
  end
end

def matrix_output(cookbooks, constraints)

def matrix_output(cookbooks, constraints)
  rows = [ "" ]
  environments = []
  constraints.each_key { |e| environments << e.to_s }
  columns = environments.count + 1
  environments.each { |env| rows << ui.color(env, :bold) }
  cookbooks.each_key do |c|
    total = []
    environments.each { |n| total << constraints[n][c] }
    if total.uniq.count == 1
      next if config[:mismatch]
      color = :white
    else
      color = :yellow
    end
    rows << ui.color(c, :bold)
    environments.each do |e|
      tag = constraints[e][c] || "latest"
      rows << ui.color(tag, color)
    end
  end
  ui.list(rows, :uneven_columns_across, columns)
end

def run

def run
  # Get the commandline environments or all if none are provided.

  environments = environment_list
  # Get a list of all cookbooks that have constraints and their environment.

  constraints = constraint_list(environments)
  # Get the total list of cookbooks that have constraints

  cookbooks = cookbook_list(constraints)
  # If we cannot find any cookbooks, we can stop here.

  if cookbooks.nil? || cookbooks.empty?
    ui.error "Cannot find any environment cookbook constraints"
    exit 1
  end
  # Get all cookbooks so we can compare them all

  cookbooks = rest.get("/cookbooks?num_versions=1") if config[:all]
  # display matrix view of in the requested format.

  if config[:format] == "summary"
    matrix = matrix_output(cookbooks, constraints)
    ui.output(matrix)
  else
    ui.output(constraints)
  end
end