#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
## brew server: Run a local webserver for browsing available and installed brews.
# Note: this external command is ruby, but set up as a shell script, so that it gets exec'd.
# This is required for sinatra's run-loop to take over.
$:.unshift(ENV['HOMEBREW_LIBRARY_PATH'])
require 'global'
require 'formula'
require 'rubygems'
begin
  require 'sinatra'
rescue LoadError
  onoe 'Sinatra required but not found'
  puts 'To install: /usr/bin/gem install sinatra'
  exit 1
end
require 'cgi'
def link_to_formula name
  "#{name}"
end
def css_style
  "" # No CSS defined yet.
end
def search_form
  <<-EOS
    
  EOS
end
def html_page
  body = <<-HTML
  
    
      Homebrew Menu
      #{css_style}
    
    
      
  			
  			
  HTML
  yield body
  body += <<-HTML
        
       
    
  
  HTML
  return body
end
get '/' do
  return html_page do |s|
    s << <<-HTML
    #{search_form}
    
      
    HTML
    Formula.names do |name|
      s << "- #{link_to_formula(name)}"
    end
    s << <<-HTML
 
    HTML
  end
end
get '/search' do
  q = params['q']
  results = search_brews(q)
  s = <<-HTML
    
    
      Search Results
      #{css_style}
    
    
    Results
    #{search_form}
    Searched for “#{q}”
    
  HTML
  results.each do |name|
    s << "- #{link_to_formula(name)}"
  end
  s += <<-HTML
HTML
  return s
end
get '/formula/:name' do
  klass = Formula.factory(params[:name])
  installed = klass.installed? ? "Installed at" : "Not installed."
  installed_dd = klass.installed? ? "#{klass.prefix}" : ""
  s = ""
  s << <<-HTML
    
      
        Formula: #{klass.name}
        #{css_style}#{klass.name}
        
          - Version
- #{klass.version}
- Homepage
- #{klass.homepage}
- Download
- #{klass.url}
- #{installed}
- #{installed_dd}HTML
  unless klass.deps.count == 0
    s << <<-HTML
- Depends on
    HTML
    klass.deps.each do |dep|
      s << "
- #{link_to_formula(dep.name)}"
    end
  end
  used_by = Formula.select{|ff| ff.deps.include?(klass.name)}.map{|f| f.name}.flatten.uniq.sort
  unless used_by.empty?
    s << <<-HTML
- Used by
    HTML
    if used_by != nil
      used_by.each do |name|
        s << "
- #{link_to_formula(name)}"
      end
    end
  end
  s += <<-HTML
HTML
  return s
end
def installed_formulas
  Formula.select{|formula| formula.installed?}
end
get '/installed' do
  s = <<-HTML
    
    
      Installed Formulas
      #{css_style}Installed Fomulas
    
  HTML
  installed_formulas.each do |formula|
    s << "- #{link_to_formula(formula.name)}"
  end
  s += <<-HTML
HTML
  return s
end
puts "View our tasting menu at http://localhost:4567/\nUse \"Control-C\" to exit.\n\n"