#!/usr/bin/env ruby

require 'zlib'
require 'yaml'
require 'rubygems'
require 'rubygems/remote_installer'
require 'libglade2'

PKG_CACHE_PATH = File::join(ENV['HOME'], '.gemboree', 'pkg_cache.yaml.gz')

module Gemboree
  class PackageCache
    attr_accessor :gems

    def load_remote
      @gems = Gem::RemoteInstaller.new().search(//)
    end

    def load_local(path = nil)
      path ||= @path
      if file = File::open(path, 'r')
        gz = Zlib::GzipReader.new(file)
        @gems = YAML::load gz.read
        gz.close
      end
    end
    
    def save(path = nil)
      path ||= @path
      if file = File::open(path, 'w')
        gz = Zlib::GzipWriter.new(file) 
        gz.puts @gems.to_yaml
        gz.close
      end
    end

    def initialize(path)
      @path = path

      if (File::exists?(@path))
        load_local(@path)
      else
        load_remote
      end
    end
  end
  class GUI
    def setup_treeview
      cols = []
      @tv = @glade['pkg_treeview']
      %w{Name Version Author Description}.each_with_index do |title, i|
        col = Gtk::TreeViewColumn.new(title, Gtk::CellRendererText.new, {:text => 0})
        @tv.append_column(col)
      end
    end
  
    def initialize(path)
      @glade = GladeXML::new(path)
      setup_treeview
    end

    def add_gems(gems)
      model = Gtk::ListStore.new(String, String, String, String)

      gems.each do |gem|
        puts gem.name, gem.version.to_s
        row = model.append
        row[0] = gem.name.to_s
        row.next!
        row[0] =  gem.version.to_s
        row.next!
      end

      @tv.set_model(model)
      @tv.set_size_request(400, 600)
    end
  end
end

Gtk::init
cache = Gemboree::PackageCache.new(PKG_CACHE_PATH)
gui = Gemboree::GUI.new('gemboree.glade')
gui.add_gems(cache.gems[0])

Gtk::main

