require 'yaml'
require 'redcloth'

def process_faq_list( faqs )
  puts "<ul>"
  faqs.each do |faq|
    process_faq_list_item faq
  end
  puts "</ul>"
end

def process_faq_list_item( faq )
  question = faq.keys.first
  answer = faq.values.first

  print "<li>"

  question_text = RedCloth.new(question).to_html.gsub( %r{</?p>},"" )
  if answer.is_a?( Array )
    puts question_text
    process_faq_list answer
  else
    print "<a href='##{question.id}'>#{question_text}</a>"
  end

  puts "</li>"
end

def process_faq_descriptions( faqs, path=nil )
  faqs.each do |faq|
    process_faq_description faq, path
  end
end

def process_faq_description( faq, path )
  question = faq.keys.first
  path = ( path ? path + " " : "" ) + question
  answer = faq.values.first

  if answer.is_a?( Array )
    process_faq_descriptions( answer, path )
  else
    title = RedCloth.new( path ).to_html.gsub( %r{</?p>}, "" )
    answer = RedCloth.new( answer || "" )

    puts "<a name='#{question.id}'></a>"
    puts "<div class='faq-title'>#{title}</div>"
    puts "<div class='faq-answer'>#{add_api_links(answer.to_html)}</div>"
  end
end

API_OBJECTS = [
  "Container", "Interceptor", "LogFactory", "Logger", "LoggingInterceptor",
  "Registry", "ServicePoint", "QueryableMutex", "Pipeline::Collection",
  "Pipeline::Element" ].inject( "(" ) { |acc,name|
    acc << "|" if acc.length > 1
    acc << name
    acc
  } + ")"

def add_api_links( text )
  text.gsub( /#{API_OBJECTS}(#(\w+))?/ ) do
    disp_obj = obj = $1

    method = $3
    s = "<a href='http://needle.rubyforge.org/api/classes/Needle/#{obj}.html'>#{disp_obj}"
    s << "##{method}" if method
    s << "</a>"
    s
  end
end

faqs = YAML.load( File.read( "faq.yml" ) )

puts <<-EOF
<html>
  <head>
    <title>Needle FAQ</title>
    <style type="text/css">
      a, a:visited, a:active {
        color: #00F;
        text-decoration: none;
      }

      a:hover {
        text-decoration: underline;
      }

      .faq-list {
        color: #000;
        font-family: vera-sans, verdana, arial, sans-serif;
      }

      .faq-title {
        background: #007;
        color: #FFF;
        font-family: vera-sans, verdana, arial, sans-serif;
        padding-left: 1em;
        padding-top: 0.5em;
        padding-bottom: 0.5em;
        font-weight: bold;
        font-size: large;
        border: 1px solid #000;
      }

      .faq-answer {
        margin-left: 1em;
        color: #000;
        font-family: vera-sans, verdana, arial, sans-serif;
      }

      .faq-answer pre {
        margin-left: 1em;
        color: #000;
        background: #FFE;
        font-size: normal;
        border: 1px dotted #CCC;
        padding: 1em;
      }

      h1 {
        background: #005;
        color: #FFF;
        font-family: vera-sans, verdana, arial, sans-serif;
        padding-left: 1em;
        padding-top: 1em;
        padding-bottom: 1em;
        font-weight: bold;
        font-size: x-large;
        border: 1px solid #00F;
      }
    </style>
  </head>
  <body>
  <h1>Needle FAQ</h1>
  <div class="faq-list">
EOF

process_faq_list( faqs )
puts "</div>"
process_faq_descriptions( faqs )

puts "</body></html>"
