package tellh.com.gitclub.model.net.service;
import java.util.List;
import okhttp3.ResponseBody;
import retrofit2.Response;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
import rx.Observable;
import tellh.com.gitclub.model.entity.Branch;
import tellh.com.gitclub.model.entity.GitTree;
import tellh.com.gitclub.model.entity.ReadMe;
import tellh.com.gitclub.model.entity.RepositoryInfo;
import tellh.com.gitclub.model.entity.SearchResult;
import tellh.com.gitclub.model.entity.UserEntity;
/**
* Created by tlh on 2016/8/26 :)
*/
public interface RepositoryService {
@GET("repos/{owner}/{repo}")
Observable<RepositoryInfo> getRepoInfo(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/forks")
Observable<List<RepositoryInfo>> listForks(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/forks")
Observable<List<RepositoryInfo>> listForks(@Path("owner") String owner, @Path("repo") String repo, @Query("page") int page);
@GET("repos/{owner}/{repo}/subscribers")
Observable<List<UserEntity>> listWatchers(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/subscribers")
Observable<List<UserEntity>> listWatchers(@Path("owner") String owner, @Path("repo") String repo, @Query("page") int page);
@GET("repos/{owner}/{repo}/stargazers")
Observable<List<UserEntity>> listStargazers(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/stargazers")
Observable<List<UserEntity>> listStargazers(@Path("owner") String owner, @Path("repo") String repo, @Query("page") int page);
@GET("repos/{owner}/{repo}/contributors")
Observable<List<UserEntity>> listContributors(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/contributors")
Observable<List<UserEntity>> listContributors(@Path("owner") String owner, @Path("repo") String repo, @Query("page") int page);
@POST("repos/{owner}/{repo}/forks")
Observable<RepositoryInfo> toFork(@Path("owner") String owner, @Path("repo") String repo);
@Headers("Content-Length: 0")
@PUT("user/starred/{owner}/{repo}")
Observable<Response<ResponseBody>> toStar(@Path("owner") String owner, @Path("repo") String repo);
@Headers("Content-Length: 0")
@PUT("user/subscriptions/{owner}/{repo}")
Observable<Response<ResponseBody>> toWatch(@Path("owner") String owner, @Path("repo") String repo);
@DELETE("user/starred/{owner}/{repo}")
Observable<Response<ResponseBody>> unStar(@Path("owner") String owner, @Path("repo") String repo);
@DELETE("user/subscriptions/{owner}/{repo}")
Observable<Response<ResponseBody>> unWatch(@Path("owner") String owner, @Path("repo") String repo);
@GET("user/starred/{owner}/{repo}")
Observable<Response<ResponseBody>> checkStarred(@Path("owner") String owner, @Path("repo") String repo);
@GET("user/subscriptions/{owner}/{repo}")
//https://developer.github.com/v3/activity/watching/#check-if-you-are-watching-a-repository-legacy
Observable<Response<ResponseBody>> checkWatching(@Path("owner") String owner, @Path("repo") String repo);
@DELETE("repos/{owner}/{repo}")
//I dont want to realize this operation because repository is very treasure for a user.
Observable<Response<ResponseBody>> delete(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/readme")
Observable<ReadMe> getReadMe(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/branches")
Observable<List<Branch>> listBranches(@Path("owner") String owner, @Path("repo") String repo);
@GET("repos/{owner}/{repo}/git/trees/{sha}?recursive=1")
Observable<GitTree> getContent(@Path("owner") String owner, @Path("repo") String repo, @Path("sha") String sha);
@GET("search/repositories")
// set encoded = true to prevent from encoding the "+" in keyWord.
Observable<SearchResult<RepositoryInfo>> search(@Query(value = "q", encoded = true) String keyWord, @Query("page") int page, @Query("per_page") int pageSize);
@GET("search/repositories")
Observable<SearchResult<RepositoryInfo>> search(@Query(value = "q", encoded = true) String keyWord, @Query("sort") String sort, @Query("page") int page, @Query("per_page") int pageSize);
}