require "terminal-table"
require "fastlane_core/print_table"

module Fastlane
  class PrettyTable
    def self.print(data:, columns: nil, title: nil, column_names: nil)
      if data.is_a?(Hash)
        columns ||= data.keys
        print_rows(
          data: data.filter { |k, v| columns.include?(k) }.map { |k, v| {key: (column_names ? column_names[k] : nil) || k, value: v} },
          columns: [:key, :value],
          title: title,
          header: false
        )
      else
        columns ||= data.first.keys
        print_rows(
          data: data,
          columns: columns,
          title: title,
          column_names: column_names,
          header: true
        )
      end
    end

    def self.print_rows(data:, columns:, title: nil, column_names: nil, header: true)
      headings = header ? columns.map do |column_key|
        if column_names.nil? || column_names[column_key].nil?
          column_key.to_s.split("_").map(&:capitalize).join(" ")
        else
          column_names[column_key]
        end
      end : []

      rows = data.map do |row|
        column_values = columns.map do |column_key|
          if row[column_key].is_a?(Integer)
            row[column_key].to_s.yellow
          elsif row[column_key].is_a?(Array)
            if row[column_key].empty?
              "0"
            else
              row[column_key].count.to_s.green
            end
          elsif column_key == columns.first
            row[column_key].to_s.cyan
          else
            row[column_key] || ""
          end
        end
        column_values
      end

      transformed_rows = FastlaneCore::PrintTable.transform_output(rows)
      table = Terminal::Table.new(
        headings: headings,
        title: title.green,
        rows: transformed_rows
      )

      puts("")
      puts(table)
      puts("")
    end
  end
end
