import ScriptReceiver from './script_receiver';
import ScriptRequest from './script_request';
import * as Collections from 'core/utils/collections';
import Util from 'core/util';
import Runtime from '../runtime';

/** Sends data via JSONP.
 *
 * Data is a key-value map. Its values are JSON-encoded and then passed
 * through base64. Finally, keys and encoded values are appended to the query
 * string.
 *
 * The class itself does not guarantee raising errors on failures, as it's not
 * possible to support such feature on all browsers. Instead, JSONP endpoint
 * should call back in a way that's easy to distinguish from browser calls,
 * for example by passing a second argument to the receiver.
 *
 * @param {String} url
 * @param {Object} data key-value map of data to be submitted
 */
 export default class JSONPRequest {
   url: string;
   data: any;
   request: ScriptRequest;

   constructor(url : string, data : any) {
     this.url = url;
     this.data = data;
   }

   /** Sends the actual JSONP request.
    *
    * @param {ScriptReceiver} receiver
    */
   send(receiver : ScriptReceiver) {
     if (this.request) {
       return;
     }

     var query = Collections.buildQueryString(this.data);
     var url = this.url + "/" + receiver.number + "?" + query;
     this.request = Runtime.createScriptRequest(url);
     this.request.send(receiver);
   }

   /** Cleans up the DOM remains of the JSONP request. */
   cleanup() {
     if (this.request) {
       this.request.cleanup();
     }
   }
 }
