/**
 *
 * Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
 *
 * ====================================================================
 * 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 org.jclouds.http;

import java.util.Map;

import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.options.HttpRequestOptions;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Endpoint;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.MapBinder;
import org.jclouds.rest.annotations.MapPayloadParam;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.XMLResponseParser;
import org.jclouds.rest.binders.BindMapToMatrixParams;
import org.jclouds.rest.binders.BindToJsonPayload;
import org.jclouds.rest.binders.BindToStringPayload;
import org.jclouds.rest.internal.RestAnnotationProcessorTest.Localhost;
import org.jclouds.util.Utils;

import com.google.common.base.Function;
import com.google.common.util.concurrent.ListenableFuture;

/**
 * Sample test for the behaviour of our Integration Test jetty server.
 * 
 * @author Adrian Cole
 */
@Endpoint(Localhost.class)
public interface IntegrationTestAsyncClient {

   @HEAD
   @Path("objects/{id}")
   ListenableFuture<Boolean> exists(@PathParam("id") String path);

   @GET
   @Path("objects/{id}")
   ListenableFuture<String> download(@PathParam("id") String id);

   @GET
   @Path("{path}")
   ListenableFuture<String> synch(@PathParam("path") String id);

   @GET
   @Path("objects/{id}")
   @ExceptionParser(FooOnException.class)
   ListenableFuture<String> downloadException(@PathParam("id") String id, HttpRequestOptions options);

   static class FooOnException implements Function<Exception, String> {

      public String apply(Exception from) {
         return "foo";
      }

   }

   @GET
   @Path("objects/{id}")
   @ExceptionParser(FooOnException.class)
   ListenableFuture<String> synchException(@PathParam("id") String id,
            @HeaderParam("Range") String header);

   @PUT
   @Path("objects/{id}")
   ListenableFuture<String> upload(@PathParam("id") String id,
            @BinderParam(BindToStringPayload.class) String toPut);

   @POST
   @Path("objects/{id}")
   ListenableFuture<String> post(@PathParam("id") String id,
            @BinderParam(BindToStringPayload.class) String toPut);

   @POST
   @Path("objects/{id}")
   ListenableFuture<String> postAsInputStream(@PathParam("id") String id,
            @BinderParam(BindToInputStreamPayload.class) String toPut);

   static class BindToInputStreamPayload extends BindToStringPayload {
      @Override
      public void bindToRequest(HttpRequest request, Object payload) {
         super.bindToRequest(request, payload);
         request.setPayload(Utils.toInputStream(payload.toString()));
      }
   }

   @POST
   @Path("objects/{id}")
   @MapBinder(BindToJsonPayload.class)
   ListenableFuture<String> postJson(@PathParam("id") String id,
            @MapPayloadParam("key") String toPut);

   @POST
   @Path("objects/{id}/action/{action}")
   ListenableFuture<String> action(@PathParam("id") String id, @PathParam("action") String action,
            @BinderParam(BindMapToMatrixParams.class) Map<String, String> options);

   @GET
   @Path("objects/{id}")
   @RequestFilters(Filter.class)
   ListenableFuture<String> downloadFilter(@PathParam("id") String id,
            @HeaderParam("filterme") String header);

   static class Filter implements HttpRequestFilter {
      public void filter(HttpRequest request) throws HttpException {
         if (request.getHeaders().containsKey("filterme")) {
            request.getHeaders().put("test", "test");
         }
      }
   }

   @GET
   @Path("objects/{id}")
   ListenableFuture<String> download(@PathParam("id") String id, @HeaderParam("test") String header);
   
   @GET
   @Path("objects/{id}")
   @XMLResponseParser(BarHandler.class)
   ListenableFuture<String> downloadAndParse(@PathParam("id") String id);

   public static class BarHandler extends ParseSax.HandlerWithResult<String> {

      private String bar = null;
      private StringBuilder currentText = new StringBuilder();

      @Override
      public void endElement(String uri, String name, String qName) {
         if (qName.equals("bar")) {
            bar = currentText.toString();
         }
         currentText = new StringBuilder();
      }

      @Override
      public void characters(char ch[], int start, int length) {
         currentText.append(ch, start, length);

      }

      @Override
      public String getResult() {
         return bar;
      }

   }

   StringBuffer newStringBuffer();

}
