/*
 * 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 com.google.gwt.requestfactory.client;

import static com.google.gwt.user.client.rpc.RpcRequestBuilder.STRONG_NAME_HEADER;

import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.requestfactory.shared.RequestFactory;
import com.google.gwt.requestfactory.shared.RequestTransport;
import com.google.gwt.requestfactory.shared.ServerFailure;
import com.google.gwt.user.client.Window.Location;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * An implementation of {@link RequestTransport} that uses a
 * {@link RequestBuilder}.
 */
public class DefaultRequestTransport implements RequestTransport {
  private static final String SERVER_ERROR = "Server Error";

  /**
   * The default URL for a DefaultRequestTransport is
   * <code>{@link GWT#getHostPageBaseURL()} + {@value #URL}</code> which may be
   * overridden by calling {@link #setRequestUrl(String)}.
   */
  public static final String URL = "gwtRequest";

  /*
   * A separate logger for wire activity, which does not get logged by the
   * remote log handler, so we avoid infinite loops. All log messages that could
   * happen every time a request is made from the server should be logged to
   * this logger.
   */
  private static final Logger wireLogger = Logger.getLogger("WireActivityLogger");

  private String requestUrl = GWT.getHostPageBaseURL() + URL;

  /**
   * Returns the current URL used by this transport.
   * 
   * @return the URL as a String
   * @see #setRequestUrl(String)
   */
  public String getRequestUrl() {
    return requestUrl;
  }

  public void send(String payload, TransportReceiver receiver) {
    RequestBuilder builder = createRequestBuilder();
    configureRequestBuilder(builder);

    builder.setRequestData(payload);
    builder.setCallback(createRequestCallback(receiver));

    try {
      wireLogger.finest("Sending fire request");
      builder.send();
    } catch (RequestException e) {
      wireLogger.log(Level.SEVERE, SERVER_ERROR + " (" + e.getMessage() + ")",
          e);
    }
  }

  /**
   * Override the default URL used by this transport.
   * 
   * @param url a String URL
   * @see #getRequestUrl()
   */
  public void setRequestUrl(String url) {
    this.requestUrl = url;
  }

  /**
   * Override to change the headers sent in the HTTP request.
   * 
   * @param builder a {@link RequestBuilder} instance
   */
  protected void configureRequestBuilder(RequestBuilder builder) {
    builder.setHeader("Content-Type", RequestFactory.JSON_CONTENT_TYPE_UTF8);
    builder.setHeader("pageurl", Location.getHref());
    builder.setHeader(STRONG_NAME_HEADER, GWT.getPermutationStrongName());
  }

  /**
   * Constructs a {@link RequestBuilder} using the {@link RequestBuilder#POST}
   * method sent to the URL returned from {@link #getRequestUrl()}.
   * 
   * @return a {@link RequestBuilder} instance
   */
  protected RequestBuilder createRequestBuilder() {
    return new RequestBuilder(RequestBuilder.POST, getRequestUrl());
  }

  /**
   * Creates a RequestCallback that maps the HTTP response onto the
   * {@link com.google.gwt.requestfactory.shared.RequestTransport.TransportReceiver
   * TransportReceiver} interface.
   * 
   * @param receiver a {@link TransportReceiver}
   * @return a {@link RequestCallback} instance
   */
  protected RequestCallback createRequestCallback(
      final TransportReceiver receiver) {
    return new RequestCallback() {

      public void onError(Request request, Throwable exception) {
        wireLogger.log(Level.SEVERE, SERVER_ERROR, exception);
        receiver.onTransportFailure(new ServerFailure(exception.getMessage()));
      }

      public void onResponseReceived(Request request, Response response) {
        wireLogger.finest("Response received");
        if (Response.SC_OK == response.getStatusCode()) {
          String text = response.getText();
          receiver.onTransportSuccess(text);
        } else {
          String message = SERVER_ERROR + " " + response.getStatusCode() + " "
              + response.getText();
          wireLogger.severe(message);
          receiver.onTransportFailure(new ServerFailure(message));
        }
      }
    };
  }
}
