#!/usr/bin/ruby

require 'rubygems'
require 'cgi'
require 'erb'
require 'dbi'
require 'json/add/rails'

class LayoutTest
  def main
    init
    parse_opts
    connect_to_gallery
    read_blocks_info
    read_layout_info
    output_layout
  rescue => e
    fatals_to_browser e
  end

  protected
  
  def fatals_to_browser err
    erb('fatal',:err => err)
    exit
  end
  
  def init
    @cgi = CGI.new('html3')
    print @cgi.header
  end
  

  def parse_opts
    @block = @cgi['block']
    @block = 'pcore' if @block.empty?
    @parent = @cgi['parent']
  end
  

  def connect_to_gallery
    @dbi = DBI.connect('DBI:mysql:db_name:host',
		       'username','passwd')
  end
  

  def read_blocks_info
    @children = read_children_of(@block)
  end
  

  def read_children_of block
    query("select block from blocks_info " +
	  "where `prop` = 'parent' and " +
	  "`value` = '#{@block}'").
      map { |row| row['block'] }
  end
    

  def read_layout_info
    @instance = {}
    @layout = {}

    instances = query("select * from layout_instance " +
		      "where `cell` = '#{@block}'")
    instances.each do |inst|
      @instance[inst['instance']] = inst
      #puts "#{inst['instance']} = #{inst.inspect}"
    end
    
    chillins = @children.map{|c| "'#{c}'"}.join(',')
    layouts = query("select * from layout_info " +
		    "where `cell` in ('#{@block}',#{chillins})")
    layouts.each do |lo|
      @layout[lo['cell']] = lo
      #puts "#{lo['cell']} = #{lo.inspect}"
    end

  end
  

  def output_layout
    erb('index')
  end


  def layout_block
    lo = @layout[@block]
    %Q{layout.block('#{@block}',#{lo.to_json});}
  end
  
  def layout_child child
    output = ''
    @instance.values.each do |inst|
      next unless inst['child'] == child
      lo = @layout[child].dup.merge(inst)
      output << %Q{layout.block('#{inst['instance']}',#{lo.to_json});}
    end
    output
  end
  
  
  def query sql
    rows = []
    sth = @dbi.execute(sql)
    sth.fetch_hash do |row|
      rows << row.dup
    end
    sth.finish
    rows
  end
  
    
  def erb tname, vals={}
    v = vals
    template = IO.read("#{tname}.html.erb")
    print ERB.new(template).result(binding())
  end
  
  
end

LayoutTest.new.main

