package com.github.vaibhavsinha.kong.internal.plugin.authentication;

import java.util.Map;

import com.github.vaibhavsinha.kong.model.plugin.authentication.oauth2.Application;
import com.github.vaibhavsinha.kong.model.plugin.authentication.oauth2.ApplicationList;
import com.github.vaibhavsinha.kong.model.plugin.authentication.oauth2.AuthorizationRequest;
import com.github.vaibhavsinha.kong.model.plugin.authentication.oauth2.GrantTokenRequest;
import com.github.vaibhavsinha.kong.model.plugin.authentication.oauth2.Token;
import com.github.vaibhavsinha.kong.model.plugin.authentication.oauth2.TokenList;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * Created by fanhua on 2017-08-07.
 */
public interface RetrofitOAuth2ManageService {


    // App Management ---------------------------------------------------------------------------------------------------

    /**
     * Create OAuth2 application for the consumer
     * */
    @POST("/consumers/{consumer_id}/oauth2")
    Call<Application> createConsumerApplication(@Path("consumer_id") String consumerId, @Body Application request);

    @GET("/consumers/{consumer_id}/oauth2/{id}")
    Call<Application> getConsumerApplication(@Path("consumer_id") String consumerId, @Path("id") String applicationId);

    @PATCH("/consumers/{consumer_id}/oauth2/{id}")
    Call<Application> updateConsumerApplication(@Path("consumer_id") String consumerId, @Path("id") String applicationId, @Body Application request);

    @DELETE("/consumers/{consumer_id}/oauth2/{id}")
    Call<Void> deleteConsumerApplication(@Path("consumer_id") String consumerId, @Path("id") String applicationId);


    /**
     * Get OAuth2 application list of the consumer, only consumerId accepted...
     * */
    @GET("/consumers/{consumer_id}/oauth2")
    Call<ApplicationList> listConsumerApplications(@Path("consumer_id") String consumerId);


    /**
     * List Client OAuth2 applications, by id / name / client_id / client_secret / consumer_id (and or)
     * */
    @GET("/oauth2")
    Call<ApplicationList> listClientApplications(@Query("id") String applicationId, @Query("name") String applicatonName, @Query("client_id") String clientId,
			@Query("client_secret") String clientSecret, @Query("consumer_id") String consumerId);


    // Token Management ---------------------------------------------------------------------------------------------------


    @POST("/oauth2_tokens")
    Call<Token> createToken(@Body Token request);


    @GET("/oauth2_tokens/{id}")
    Call<Token> getToken(@Path("id") String tokenId);

    @PATCH("/oauth2_tokens/{id}")
    Call<Token> updateToken(@Path("id") String tokenId, @Body Token request);

    @DELETE("/oauth2_tokens/{id}")
    Call<Token> deleteToken(@Path("id") String tokenId);


    @POST("/oauth2_tokens")
    Call<TokenList> listTokens();



}