class W3DHub
  def self.format_size(bytes)
    case bytes
    when 0..1023 # Bytes
      "#{bytes} B"
    when 1024..1_048_575 # KiloBytes
      "#{format_size_number(bytes / 1024.0)} KB"
    when 1_048_576..1_073_741_999 # MegaBytes
      "#{format_size_number(bytes / 1_048_576.0)} MB"
    else # GigaBytes
      "#{format_size_number(bytes / 1_073_742_000.0)} GB"
    end
  end

  def self.format_size_number(i)
    format("%0.2f", i)
  end

  def self.windows?
    RbConfig::CONFIG["host_os"] =~ /(mingw|mswin|windows)/i
  end

  def self.mac?
    RbConfig::CONFIG["host_os"] =~ /(darwin|mac os)/i
  end

  def self.linux?
    RbConfig::CONFIG["host_os"] =~ /(linux|bsd|aix|solaris)/i
  end

  def self.unix?
    linux? || mac?
  end

  def self.tar_command
    if windows?
      "tar"
    else
      "bsdtar"
    end
  end

  def self.home_directory
    File.expand_path("~")
  end

  def self.ask_file(title: "Open File", filter: "*game*.exe")
    if W3DHub.unix?
      # search for command
      cmds = %w{ zenity matedialog qarma kdialog }

      command = cmds.find do |cmd|
        cmd if system("which #{cmd}")
      end

      path = case File.basename(command)
      when "zenity", "matedialog", "qarma"
        `#{command} --file-selection --title "#{title}" --file-filter "#{filter}"`
      when "kdialog"
        `#{command} --title "#{title}" --getopenfilename . "#{filter}"`
      else
        raise "No known command found for system file selection dialog!"
      end

      path.strip
    else
      raise NotImplementedError
    end
  end
end
