#### KEWEGO

module Kewego

  def prepare_access_token(oauth_token, oauth_token_secret)
      consumer = OAuth::Consumer.new("APIKey", "APISecret",
          { :site => 'http://login.kewego.com/api/getAuthToken',
          })
      token_hash = { :oauth_token => oauth_token,
          }
      access_token = OAuth::AccessToken.from_hash(consumer, token_hash )
      return access_token
  end

  def format_flux_kewe(title_var,descpt_var,meta_var,categ_var,file_2_upload_var)

      #file_xml_out =File.open("data/poubelle/datas.xml",'w')

      meta = meta_var.split(/,/)

      doc = REXML::Document.new

      #xm = doc.add_element("?xml")
      #xm.add_attribute("version", "1.0")
      #xm.add_attribute("encoding", "UTF-8")

      doc.add_element("kewego_call")

      doc.root.add_element("params")
      vidz = doc.root.elements[1]

      title = REXML::Element.new("title")
      title.text = title_var
      vidz.elements << title

      desc = REXML::Element.new("description")
      desc.text = descpt_var
      vidz.elements << desc

      cat = REXML::Element.new("categories")
      cat.add_element("category")
      cat.elements["category"].text = categ_var

      vidz.elements << cat

      key = REXML::Element.new("keywords")
      meta.each{ |keywrd|
          sous_key = key.add_element("keyword")
          sous_key.text = keywrd
          }
      vidz.elements << key

      lang = REXML::Element.new("language")
      lang.text = "fr"
      vidz.elements << lang

      #file_xml_out.write doc
      #file_xml_out.close
      return doc
  end

  def query_to_multipart(boundary, attributes={}) #:nodoc:
    file = attributes.delete(:file)
    params = [file_to_multipart("file", File.basename(file),
      "video/mp4", File.open(file))]

    attributes.each_pair{|k,v| params << text_to_multipart(k.to_s, v.to_s)}
    params.map do |p|
      '--' + boundary + "\r\n" + p
    end.join('') + "--" + boundary + "--\r\n"
  end

  def text_to_multipart(key,value)
    text = ""
    value = [value] if !value.instance_of? Array
    value.map{|v| text += "Content-Disposition: form-data; name=\"#{key}\"\r\n\r\n#{v}\r\n"}
    text
  end

  def file_to_multipart(key,filename,mime_type,content)
    mem_buf = content.read
    return "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{filename}\"\r\n" +
         "Content-Type: #{mime_type}\r\n" +
         "\r\n" +
         "#{mem_buf}\r\n"
         #"FILE_DATA_GOES_HERE\r\n"
  end

  def kewego_load(title_var,descpt_var,meta_var,file_vid, categ_var, subcat, username, password, api_key)

    #puts "enter the KEWEGO loader \r\n"
    #puts file_2_upload_var

    ##############################################
    get_token_url = 'http://api.kewego.com/app/getToken/' # app_token
    get_auth_token_url = 'http://login.kewego.com/api/getAuthToken/' #auth_token
    upload_file_url = 'http://api.kewego.com/upload/uploadFile/index.php'
    upload_video_url = "http://upload.kewego.com/api/uploadVideo/index.php"
    get_related_page_url = "http://api.kewego.com/video/getRelatedPageUrl/"    

    ## APP TOKEN
    @ap_token = api_post(get_token_url, {'appKey' => api_key}, "kewego_response/message/appToken") 

    ## AUTH TOKEN
    @auth_token = api_post(get_auth_token_url, {'username' => username, 'password'=> password, 'appToken' => @ap_token}, "kewego_response/message/token") 
    
    ## FORMAT XML
    xml_data3 = ''
    file_xml_out = format_flux_kewe(title_var,descpt_var,meta_var,categ_var,file_vid)

    ## PREPARE UPLOAD
    s_md5 = Digest::MD5.hexdigest(file_vid)
    file_vid_z = File.open(file_vid,'r')

    # uploadFile
    boundary = Digest::MD5.hexdigest(DateTime.now.to_s)
    query = query_to_multipart(boundary, {:file => file_vid, 'xml_data' => file_xml_out, 'appToken' => @ap_token, 'token' => @auth_token})

    uri = URI.parse( upload_video_url )
    puts "Requesting #{uri.to_s}"
    http = Net::HTTP.new(uri.host, uri.port)
    xml_data5 = http.start.post2(uri.request_uri,query,{"Content-type" => "multipart/form-data; boundary=" + boundary}).body
    
    doc = REXML::Document.new(xml_data5)
    sig_node = doc.get_elements("/kewego_response/message/sig").first
    if sig_node
      sig = sig_node.text
      #url = api_post( get_related_page_url, {'sig' => sig, 'appToken' => @ap_token}, "/kewego_response/message/url")
      #url 
      sig
    end
  end
  
  def api_post(url, params, result_xpath)
    puts "Requesting #{url}"
    xml_data = Net::HTTP.post_form( URI.parse( url ), params).body
    doc = REXML::Document.new(xml_data)
    elements = doc.get_elements(result_xpath).first
    error_node = doc.get_elements("/kewego_response/kewego_error").first
    if elements
      unless error_node.nil? 
        puts "WARNING: #{error_node.text}"
      end
      
      #puts "Returning: #{elements.text}
      elements.text
    else
      if error_node.nil? 
        raise "Error finding #{result_xpath} in #{xml_data}"
      else
        raise error_node.text
      end
    end
  end
end

#### FIN KEWEGO