/*
 * Copyright 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package elemental.js.util;

import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.xhr.client.ReadyStateChangeHandler;
import com.google.gwt.xhr.client.XMLHttpRequest;


import elemental.client.Browser;
import elemental.html.Window;

/**
 * A Simpler way to use {@link XMLHttpRequest}.
 */
@Deprecated
public class Xhr {
  /**
   * Interface for getting notified when an XHR successfully completes, or
   * errors out.
   */
  @Deprecated
  public interface Callback {
    void onFail(XMLHttpRequest xhr);

    void onSuccess(XMLHttpRequest xhr);
  }

  private static class Handler implements ReadyStateChangeHandler {
    private final Callback callback;

    private Handler(Callback callback) {
      this.callback = callback;
    }

    public void onReadyStateChange(XMLHttpRequest xhr) {
      if (xhr.getReadyState() == XMLHttpRequest.DONE) {
        if (xhr.getStatus() == 200) {
          callback.onSuccess(xhr);
          xhr.clearOnReadyStateChange();
          return;
        }
        callback.onFail(xhr);
        xhr.clearOnReadyStateChange();
      }
    }
  }

  /**
   * Send a GET request to the <code>url</code> and dispatch updates to the
   * <code>callback</code>.
   *
   * @param url
   * @param callback
   */
  public static void get(String url, Callback callback) {
    request(create(), "GET", url, callback);
  }

  /**
   * Send a GET request to the <code>url</code> and dispatch updates to the
   * <code>callback</code>.
   *
   * @param window the window object used to access the XMLHttpRequest
   *        constructor
   * @param url
   * @param callback
   */
  public static void get(Window window, String url, Callback callback) {
    request(create(window), "GET", url, callback);
  }

  /**
   * Send a HEAD request to the <code>url</code> and dispatch updates to the
   * <code>callback</code>.
   *
   * @param url
   * @param callback
   */
  public static void head(String url, Callback callback) {
    request(create(), "HEAD", url, callback);
  }

  /**
   * Send a HEAD request to the <code>url</code> and dispatch updates to the
   * <code>callback</code>.
   *
   * @param window the window object used to access the XMLHttpRequest
   *        constructor
   * @param url
   * @param callback
   */
  public static void head(Window window, String url, Callback callback) {
    request(create(window), "HEAD", url, callback);
  }

  /**
   * Send a POST request to the <code>url</code> and dispatch updates to the
   * <code>callback</code>.
   *
   * @param url
   * @param requestData the data to be passed to XMLHttpRequest.send
   * @param contentType a value for the Content-Type HTTP header
   * @param callback
   */
  public static void post(String url, String requestData, String contentType, Callback callback) {
    request(create(), "POST", url, requestData, contentType, callback);
  }

  /**
   * Send a POST request to the <code>url</code> and dispatch updates to the
   * <code>callback</code>.
   *
   * @param window the window object used to access the XMLHttpRequest
   *        constructor
   * @param url
   * @param requestData the data to be passed to XMLHttpRequest.send
   * @param contentType a value for the Content-Type HTTP header
   * @param callback
   */
  public static void post(
      Window window, String url, String requestData, String contentType, Callback callback) {
    request(create(window), "POST", url, requestData, contentType, callback);
  }

  private static XMLHttpRequest create() {
    return create(Browser.getWindow());
  }

  /**
   * Replacement for {@link XMLHttpRequest#create()} that allows better control
   * of which window object is used to access the XMLHttpRequest constructor.
   */
  private static native XMLHttpRequest create(Window window) /*-{
    return new window.XMLHttpRequest();
  }-*/;

  private static void request(XMLHttpRequest xhr,
      String method,
      String url,
      String requestData,
      String contentType,
      Callback callback) {
    try {
      xhr.setOnReadyStateChange(new Handler(callback));
      xhr.open(method, url);
      xhr.setRequestHeader("Content-type", contentType);
      xhr.send(requestData);
    } catch (JavaScriptException e) {
      // Just fail.
      callback.onFail(xhr);
      xhr.clearOnReadyStateChange();
    }
  }

  private static void request(XMLHttpRequest xhr,
      String method,
      String url,
      final Callback callback) {
    try {
      xhr.setOnReadyStateChange(new Handler(callback));
      xhr.open(method, url);
      xhr.send();
    } catch (JavaScriptException e) {
      // Just fail.
      callback.onFail(xhr);
      xhr.clearOnReadyStateChange();
    }
  }
}
