package com.zulip.android.service;

import com.zulip.android.filters.NarrowFilter;
import com.zulip.android.networking.response.EditResponse;
import com.zulip.android.networking.response.GetMessagesResponse;
import com.zulip.android.networking.response.LoginResponse;
import com.zulip.android.networking.response.RawMessageResponse;
import com.zulip.android.networking.response.StarResponse;
import com.zulip.android.networking.response.UploadResponse;
import com.zulip.android.networking.response.UserConfigurationResponse;
import com.zulip.android.networking.response.ZulipBackendResponse;
import com.zulip.android.networking.response.events.GetEventResponse;

import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Streaming;


public interface ZulipServices {

    @GET("v1/messages?apply_markdown=true")
    Call<GetMessagesResponse> getMessages(@Query("anchor") String anchor,
                                          @Query("num_before") String numBefore,
                                          @Query("num_after") String numAfter,
                                          @Query("narrow") NarrowFilter narrowFilter);

    @GET("v1/events")
    Call<GetEventResponse> getEvents(@Query("dont_block") Boolean dontLongPoll, @Query("last_event_id") int id, @Query("queue_id") String queueId);

    @FormUrlEncoded
    @POST("v1/register")
    Call<UserConfigurationResponse> register(@Field("apply_markdown") boolean applyMarkdown);

    @FormUrlEncoded
    @POST("v1/register")
    Call<String> registerDebug(@Field("apply_markdown") boolean applyMarkdown);

    @FormUrlEncoded
    @PUT("v1/users/me/pointer")
    Call<ResponseBody> updatePointer(@Field("pointer") String pointer);

    @GET("v1/get_auth_backends")
    Call<ZulipBackendResponse> getAuthBackends();

    @FormUrlEncoded
    @POST("v1/fetch_api_key")
    Call<LoginResponse> login(@Field("username") String username, @Field("password") String password);

    @FormUrlEncoded
    @POST("v1/dev_fetch_api_key")
    Call<LoginResponse> loginDEV(@Field("username") String username);

    @Streaming
    @Multipart
    @POST("v1/user_uploads")
    Call<UploadResponse> upload(@Part MultipartBody.Part file);

    @FormUrlEncoded
    @PATCH("v1/messages/{id}")
    Call<EditResponse> editMessage(@Path("id") String messageId, @Field("content") String messageContent);

    @GET("v1/messages/{id}")
    Call<RawMessageResponse> fetchRawMessage(@Path("id") int messageId);

    @FormUrlEncoded
    @POST("v1/messages/flags")
    Call<StarResponse> starMessage(@Field("flag") String flag, @Field("op") String operation,
                                   @Field("messages") String message);

}