package vandy.mooc.model.mediator.webdata;

import java.util.Collection;

import retrofit.client.Response;
import retrofit.http.Body;
import retrofit.http.GET;
import retrofit.http.Multipart;
import retrofit.http.POST;
import retrofit.http.Part;
import retrofit.http.Path;
import retrofit.http.Streaming;
import retrofit.mime.TypedFile;

/**
 * This interface defines an API for a Video Service web service.  The
 * interface is used to provide a contract for client/server
 * interactions.  The interface is annotated with Retrofit annotations
 * to send Requests and automatically convert the Video.
 */
public interface VideoServiceProxy {
    /**
     * Used as Request Parameter for Video data.
     */
    public static final String DATA_PARAMETER = "data";

    /**
     * Used as Request Parameter for VideoId.
     */
    public static final String ID_PARAMETER = "id";

    /**
     * The path where we expect the VideoSvc to live.
     */
    public static final String VIDEO_SVC_PATH = "/video";
	
    /**
     * The path where we expect the VideoSvc to live.
     */
    public static final String VIDEO_DATA_PATH = 
        VIDEO_SVC_PATH 
        + "/{"
        + VideoServiceProxy.ID_PARAMETER
        + "}/data";

    /**
     * Sends a GET request to get the List of Videos from Video
     * Web service using a two-way Retrofit RPC call.
     */
    @GET(VIDEO_SVC_PATH)
    public Collection<Video> getVideoList();
    
    /**
     * Sends a POST request to add the Video metadata to the Video 
     * Web service using a two-way Retrofit RPC call.
     *
     * @param video meta-data
     * @return Updated video meta-data returned from the Video Service.
     */
    @POST(VIDEO_SVC_PATH)
    public Video addVideo(@Body Video video);
	
    /**
     * Sends a POST request to Upload the Video data to the Video Web
     * service using a two-way Retrofit RPC call.  @Multipart is used
     * to transfer multiple content (i.e. several files in case of a
     * file upload to a server) within one request entity.  When doing
     * so, a REST client can save the overhead of sending a sequence
     * of single requests to the server, thereby reducing network
     * latency.
     * 
     * @param id
     * @param videoData
     * @return videoStatus indicating status of the uploaded video.
     */
    @Multipart
    @POST(VIDEO_DATA_PATH)
    public VideoStatus setVideoData(@Path(ID_PARAMETER) long id,
                                    @Part(DATA_PARAMETER) TypedFile videoData);
	
    /**
     * This method uses Retrofit's @Streaming annotation to indicate
     * that the method is going to access a large stream of data
     * (e.g., the mpeg video data on the server).  The client can
     * access this stream of data by obtaining an InputStream from the
     * Response as shown below:
     * 
     * VideoServiceProxy client = ... // use retrofit to create the client
     * Response response = client.getData(someVideoId); 
     * InputStream videoDataStream = response.getBody().in();
     * 
     * @param id
     * @return Response which contains the actual Video data.
     */
    @Streaming
    @GET(VIDEO_DATA_PATH)
    Response getData(@Path(ID_PARAMETER) long id);
}