package com.kickstarter.services;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.kickstarter.libs.Config;
import com.kickstarter.models.Backing;
import com.kickstarter.models.Category;
import com.kickstarter.models.Comment;
import com.kickstarter.models.Empty;
import com.kickstarter.models.Location;
import com.kickstarter.models.Message;
import com.kickstarter.models.Project;
import com.kickstarter.models.ProjectNotification;
import com.kickstarter.models.SurveyResponse;
import com.kickstarter.models.Update;
import com.kickstarter.models.User;
import com.kickstarter.services.apirequests.CommentBody;
import com.kickstarter.services.apirequests.LoginWithFacebookBody;
import com.kickstarter.services.apirequests.MessageBody;
import com.kickstarter.services.apirequests.ProjectNotificationBody;
import com.kickstarter.services.apirequests.PushTokenBody;
import com.kickstarter.services.apirequests.RegisterWithFacebookBody;
import com.kickstarter.services.apirequests.ResetPasswordBody;
import com.kickstarter.services.apirequests.SettingsBody;
import com.kickstarter.services.apirequests.SignupBody;
import com.kickstarter.services.apirequests.XauthBody;
import com.kickstarter.services.apiresponses.AccessTokenEnvelope;
import com.kickstarter.services.apiresponses.ActivityEnvelope;
import com.kickstarter.services.apiresponses.CategoriesEnvelope;
import com.kickstarter.services.apiresponses.CommentsEnvelope;
import com.kickstarter.services.apiresponses.DiscoverEnvelope;
import com.kickstarter.services.apiresponses.MessageThreadEnvelope;
import com.kickstarter.services.apiresponses.MessageThreadsEnvelope;
import com.kickstarter.services.apiresponses.StarEnvelope;
import java.util.List;
import java.util.Map;
import retrofit2.Response;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
import rx.Observable;
public interface ApiService {
@GET("/v1/activities")
Observable<Response<ActivityEnvelope>> activities(@NonNull @Query("categories[]") List<String> categories,
@Nullable @Query("count") Integer count);
@GET
Observable<Response<ActivityEnvelope>> activities(@Url @NonNull String paginationUrl);
@GET("/v1/categories")
Observable<Response<CategoriesEnvelope>> categories();
@GET("/v1/categories/{param}")
Observable<Response<Category>> category(@Path("param") String param);
@GET("/v1/app/android/config")
Observable<Response<Config>> config();
@GET("/v1/users/self")
Observable<Response<User>> currentUser();
@GET("/v1/locations/{param}")
Observable<Response<Location>> location(@Path("param") String param);
@POST("/xauth/access_token")
Observable<Response<AccessTokenEnvelope>> login(@Body XauthBody body);
@PUT("/v1/facebook/access_token?intent=login")
Observable<Response<AccessTokenEnvelope>> login(@Body LoginWithFacebookBody body);
@PUT("/v1/facebook/access_token?intent=register")
Observable<Response<AccessTokenEnvelope>> login(@Body RegisterWithFacebookBody body);
@GET("/v1/message_threads/{message_thread_id}/messages")
Observable<Response<MessageThreadEnvelope>> messagesForThread(@Path("message_thread_id") long messageThreadId);
// Todo: replace "inbox" with Mailbox "inbox" or "sent" value
@GET("/v1/message_threads/inbox")
Observable<Response<MessageThreadsEnvelope>> messageThreads();
@GET("/v1/projects/{project_id}/message_threads/inbox")
Observable<Response<MessageThreadsEnvelope>> messageThreads(@Path("project_id") long projectId);
@GET
Observable<Response<CommentsEnvelope>> paginatedProjectComments(@Url String paginationPath);
@GET
Observable<Response<MessageThreadsEnvelope>> paginatedMessageThreads(@Url String paginationPath);
@POST("/v1/projects/{param}/comments/")
Observable<Response<Comment>> postProjectComment(@Path("param") String param, @Body CommentBody body);
@POST("/v1/projects/{project_id}/updates/{update_id}/comments")
Observable<Response<Comment>> postUpdateComment(@Path("project_id") long projectId, @Path("update_id") long updateId,
@Body CommentBody body);
@GET("/v1/projects/{project_param}/backers/{user_param}")
Observable<Response<Backing>> projectBacking(
@Path("project_param") String projectParam,
@Path("user_param") String userParam
);
@GET("/v1/projects/{param}")
Observable<Response<Project>> project(@Path("param") String param);
@GET("/v1/projects/{project_param}/comments")
Observable<Response<CommentsEnvelope>> projectComments(@Path("project_param") String projectParam);
@GET("/v1/users/self/notifications")
Observable<Response<List<ProjectNotification>>> projectNotifications();
@GET("/v1/discover")
Observable<Response<DiscoverEnvelope>> projects(@QueryMap Map<String, String> params);
@GET
Observable<Response<DiscoverEnvelope>> projects(@Url String paginationUrl);
@POST("/v1/users/self/push_tokens")
Observable<Response<Empty>> registerPushToken(@Body PushTokenBody body);
@POST("/v1/users/reset")
Observable<Response<User>> resetPassword(@Body ResetPasswordBody body);
@POST("/v1/message_threads/{message_thread_id}/messages")
Observable<Response<Message>> sendMessageToThread(@Path("message_thread_id") long messageThreadId, @Body MessageBody body);
@POST("/v1/projects/{project_id}/backers/{backer_id}/messages")
Observable<Response<Message>> sendMessageToBacker(
@Path("project_id") long projectId, @Path("backer_id") long backerId, @Body MessageBody body
);
@POST("/v1/projects/{project_id}/messages")
Observable<Response<Message>> sendMessageToProject(@Path("project_id") long projectId, @Body MessageBody body);
@POST("/v1/users")
Observable<Response<AccessTokenEnvelope>> signup(@Body SignupBody body);
@PUT("/v1/projects/{param}/star")
Observable<Response<StarEnvelope>> starProject(@Path("param") String param);
@GET("/v1/users/self/surveys/{survey_response_id}")
Observable<Response<SurveyResponse>> surveyResponse(@Path("surveyResponseId") int surveyResponseId);
@POST("/v1/projects/{param}/star/toggle")
Observable<Response<StarEnvelope>> toggleProjectStar(@Path("param") String param);
@GET("/v1/users/self/surveys/unanswered")
Observable<Response<List<SurveyResponse>>> unansweredSurveys();
@GET("/v1/projects/{project_param}/updates/{update_param}")
Observable<Response<Update>> update(@Path("project_param") String projectParam, @Path("update_param") String updateParam);
@GET("/v1/projects/{project_id}/updates/{update_id}/comments")
Observable<Response<CommentsEnvelope>> updateComments(@Path("project_id") long projectId, @Path("update_id") long updateId);
@PUT("/v1/users/self/notifications/{id}")
Observable<Response<ProjectNotification>> updateProjectNotifications(@Path("id") long projectNotificationId,
@Body ProjectNotificationBody projectNotificationBody);
@PUT("/v1/users/self")
Observable<Response<User>> updateUserSettings(@Body SettingsBody body);
}