require 'net/http'

class CodePadSender
  CODEPAD_URL = 'http://codepad.org/'
  DIV_CODE_TAG = "<div class=\"code\">"
  DIV_CODE_TAG_XPATH = "//div[@class='code']"
  REGEX_REDIRECT_URL = /<a href=\"\/([A-Za-z0-9]+)\">/
  
  def send_code(code, lang, to_private, run_code)
    @highlighted_code_tag = @result_tag = nil
    
    body = get_highlighted_page_content(code, lang, to_private, run_code)
        
    return nil if !body
    
    return nil if !get_code_area(body)
    
    return true    
  end
  
  def get_code_div_to_element_obj
    return @highlighted_code_tag
  end
  
  def get_code_div_string
    return @highlighted_code_tag.to_s
  end
  
  def get_result_div_to_element_obj
    return @result_tag
  end
  
  def get_result_div_string
    return @result_tag.to_s
  end
  
  private 
  
  def get_highlighted_page_content(code, lang, to_private, run_code)
    
    res = Net::HTTP.post_form( URI.parse(CODEPAD_URL), 
          { :lang => lang, :private => to_private, :run => run_code, 
            :code => code } )
    
    body = res.body
    
    # it seems redirect page, but res obj is HTTPFound. So let me check that using this string
    if !body.include?(DIV_CODE_TAG)
      md1 = REGEX_REDIRECT_URL.match(res.body)

      if md1 && md1[1]
        # not nil
        real_url = CODEPAD_URL + md1[1]
        res = Net::HTTP.get( URI.parse(real_url) )

        body = res
      else
        # nil - Exception!!
        return nil
      end

    end
    
    return body
  end
  
  def get_code_area(highlighted_page_body)
    doc = Hpricot(highlighted_page_body)

    return nil if !doc

    code_div_tags = doc.search(DIV_CODE_TAG_XPATH)
    if !code_div_tags || code_div_tags.length < 1
      # Code Div. not found!!
      return nil
    else
      @highlighted_code_tag = code_div_tags[0]
      @result_tag = code_div_tags[1]
    end
    
    return true
  end
  
end
