package com.quinn.githubknife.model;
import com.quinn.httpknife.github.Branch;
import com.quinn.httpknife.github.Empty;
import com.quinn.httpknife.github.Event;
import com.quinn.httpknife.github.RepoSearch;
import com.quinn.httpknife.github.Repository;
import com.quinn.httpknife.github.Token;
import com.quinn.httpknife.github.Tree;
import com.quinn.httpknife.github.User;
import com.quinn.httpknife.github.UserSearch;
import java.util.List;
import retrofit.Call;
import retrofit.Response;
import retrofit.http.Body;
import retrofit.http.DELETE;
import retrofit.http.GET;
import retrofit.http.Header;
import retrofit.http.POST;
import retrofit.http.PUT;
import retrofit.http.Path;
import retrofit.http.Query;
import rx.Observable;
/**
* Created by Quinn on 10/10/15.
*/
public interface GithubService{
// Api about token
@POST("authorizations")
Observable<Response<Token>> createToken(@Body Token token, @Header("Authorization") String authorization) ;
@GET("authorizations")
Observable<Response<List<Token>>> listToken(@Header("Authorization") String authorization) ;
@DELETE("authorizations/{id}")
Observable<Response<Empty>> removeToken(@Header("Authorization") String authorization, @Path("id") String id) ;
//Api about user
@GET("/user")
Observable<Response<User>> authUser();
@GET("/users/{username}")
Observable<Response<User>> user(@Path("username") String username);
@GET("/users/{user}/following?per_page=10")
Observable<Response<List<User>>> follwerings(@Path("user") String user,@Query("page") String page);
@GET("/users/{user}/followers?per_page=10")
Observable<Response<List<User>>> followers(@Path("user") String user,@Query("page") String page);
@GET("/users/{user}/repos?sort=pushed&per_page=10")
Call<List<Repository>> userRepo(@Path("user") String user,@Query("page") String page);
@GET("/users/{user}/starred?per_page=10")
Call<List<Repository>> starredRepo(@Path("user") String user,@Query("page") String page);
@GET("/users/{user}/events/public?per_page=10")
Call<List<Event>> publicEvent(@Path("user") String user,@Query("page") String page);
@GET("/users/{user}/received_events?per_page=10")
Call<List<Event>> receivedEvent(@Path("user") String user,@Query("page") String page);
@GET("/user/starred/{owner}/{repo}")
Call<Empty> hasStar(@Path("owner") String owner, @Path("repo") String repo);
@PUT("/user/starred/{owner}/{repo}")
Call<Empty> star(@Path("owner") String owner, @Path("repo") String repo);
@DELETE("/user/starred/{owner}/{repo}")
Call<Empty> unStar(@Path("owner") String owner, @Path("repo") String repo);
//Get count of starred repo of someone
@GET("/users/{user}/starred?&per_page=1")
Observable<Response<List<Repository>>> starredCount(@Path("user") String user);
//Api about repo
@GET("/repos/{owner}/{repo}/stargazers?&per_page=10")
Call<List<User>> stargazers(@Path("owner") String owner, @Path("repo") String repo,@Query("page") String page);
@GET("/repos/{owner}/{repo}/forks?&per_page=10")
Call<List<User>> forkers(@Path("owner") String owner, @Path("repo") String repo,@Query("page") String page);
@GET("/repos/{owner}/{repo}/collaborators?&per_page=10")
Call<List<User>> collaborators(@Path("owner") String owner, @Path("repo") String repo,@Query("page") String page);
@GET("/repos/{owner}/{repo}/branches")
Call<List<Branch>> getBranches(@Path("owner") String owner, @Path("repo") String repo);
@GET("/repos/{owner}/{repo}/git/trees/{sha}?&per_page=10")
Call<Tree> getTree(@Path("owner") String owner, @Path("repo") String repo,@Path("sha") String sha);
@GET("/repos/{owner}/{repo}/forks")
Call<List<Repository>> fork(@Path("owner") String owner, @Path("repo") String repo);
@GET("/repos/{owner}/{repo}/contents/{path}")
Call<String> getRawContent(@Path("owner") String owner, @Path("repo") String repo,@Path("path") String path);
@GET("/repos/{owner}/{repo}")
Call<Repository> repo(@Path("owner") String owner, @Path("repo") String repo);
//Api about search
@GET("/search/users?&perpage=10")
Call<UserSearch> searchUser(@Query("q") String q, @Query("page") String page);
@GET("/search/repositories?&per_page=10")
Call<RepoSearch> searchRepo(@Query("q") String q, @Query("page") String page);
//==========
//Api about user-user relation
//==========
@GET("/user/following/{username}")
Observable<Response<Empty>> hasFollow(@Path("username") String username);
@PUT("/user/following/{username}")
Observable<Response<Empty>> follow(@Path("username") String username);
@DELETE("/user/following/{username}")
Observable<Response<Empty>> unFollow(@Path("username") String username);
}