// Path: app/src/main/java/com/konifar/annict/model/Programs.java
// @Parcel
// public class Programs {
// 
//     @SerializedName("programs")
//     public List<Program> list;
// }
// 
// Path: app/src/main/java/com/konifar/annict/model/Record.java
// @Parcel
// @Table
// public class Record {
// 
//     @PrimaryKey(auto = false)
//     @Column(indexed = true)
//     @SerializedName("id")
//     public long id;
// 
//     @Column
//     @SerializedName("comment")
//     public String comment;
// 
//     @Nullable
//     @Column
//     @SerializedName("rating")
//     public Long rating;
// 
//     @Column
//     @SerializedName("is_modified")
//     public boolean isModified;
// 
//     @Column
//     @SerializedName("likes_count")
//     public int likesCount;
// 
//     @Column
//     @SerializedName("comments_count")
//     public int commentsCount;
// 
//     @Column
//     @SerializedName("created_at")
//     public Date createdAt;
// 
//     @Column(indexed = true)
//     @SerializedName("user")
//     public User user;
// 
//     @Column(indexed = true)
//     @SerializedName("work")
//     public Work work;
// 
//     @Column(indexed = true)
//     @SerializedName("episode")
//     public Work episode;
// 
//     public Record() {
//         //
//     }
// }
// 
// Path: app/src/main/java/com/konifar/annict/model/Token.java
// public class Token {
// 
//     @SerializedName("access_token")
//     public String accessToken;
// 
//     @SerializedName("token_type")
//     public String tokenType;
// 
//     @SerializedName("expires_in")
//     public long expiresIn;
// 
//     @SerializedName("scope")
//     public String scope;
// 
//     @SerializedName("created_at")
//     public long createdAt;
// }
// 
// Path: app/src/main/java/com/konifar/annict/model/Works.java
// @Parcel
// public class Works {
// 
//     @SerializedName("works")
//     public List<Work> list;
// }


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.konifar.annict.BuildConfig;
import com.konifar.annict.model.Programs;
import com.konifar.annict.model.Record;
import com.konifar.annict.model.Token;
import com.konifar.annict.model.Works;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
import rx.Observable;
        /**
         * https://annict.wikihub.io/wiki/api/authentication
         */
        @POST("/oauth/token")
        Observable<Token> postOauthToken(
            @Query("client_id") String clientId,
            @Query("client_secret") String clientSecret, @Query("grant_type") String grantType,
            @Query("redirect_uri") String scope, @Query("code") String code
        );

        /**
         * https://annict.wikihub.io/wiki/api/me-programs
         */
        @GET("/v1/me/programs")
        Observable<Programs> getMeProgarms(
            @Query("fields") @Nullable String fields, @Query("filter_ids") @Nullable String filterIds,
            @Query("filter_channel_ids") @Nullable String filterChannelIds,
            @Query("filter_work_ids") @Nullable String filterWorkIds,
            @Query("filter_started_at_gt") @Nullable String filterStartedAtGt,
            @Query("filter_started_at_lt") @Nullable String filterStartedAtLt,
            @Query("filter_unwatched") @Nullable Boolean filterUnwatched,
            @Query("filter_rebroadcast") @Nullable Boolean filterRebroadcast, @Query("page") int page,
            @Query("per_page") int perPage, @Query("sort_id") @Nullable String sortId,
            @Query("sort_started_at") @Nullable String sortStartedAt
        );

        /**
         * https://annict.wikihub.io/wiki/api/me-works
         */
        @GET("/v1/me/works")
// Path: app/src/main/java/com/konifar/annict/model/Programs.java
// @Parcel
// public class Programs {
// 
//     @SerializedName("programs")
//     public List<Program> list;
// }
// 
// Path: app/src/main/java/com/konifar/annict/model/Record.java
// @Parcel
// @Table
// public class Record {
// 
//     @PrimaryKey(auto = false)
//     @Column(indexed = true)
//     @SerializedName("id")
//     public long id;
// 
//     @Column
//     @SerializedName("comment")
//     public String comment;
// 
//     @Nullable
//     @Column
//     @SerializedName("rating")
//     public Long rating;
// 
//     @Column
//     @SerializedName("is_modified")
//     public boolean isModified;
// 
//     @Column
//     @SerializedName("likes_count")
//     public int likesCount;
// 
//     @Column
//     @SerializedName("comments_count")
//     public int commentsCount;
// 
//     @Column
//     @SerializedName("created_at")
//     public Date createdAt;
// 
//     @Column(indexed = true)
//     @SerializedName("user")
//     public User user;
// 
//     @Column(indexed = true)
//     @SerializedName("work")
//     public Work work;
// 
//     @Column(indexed = true)
//     @SerializedName("episode")
//     public Work episode;
// 
//     public Record() {
//         //
//     }
// }
// 
// Path: app/src/main/java/com/konifar/annict/model/Token.java
// public class Token {
// 
//     @SerializedName("access_token")
//     public String accessToken;
// 
//     @SerializedName("token_type")
//     public String tokenType;
// 
//     @SerializedName("expires_in")
//     public long expiresIn;
// 
//     @SerializedName("scope")
//     public String scope;
// 
//     @SerializedName("created_at")
//     public long createdAt;
// }
// 
// Path: app/src/main/java/com/konifar/annict/model/Works.java
// @Parcel
// public class Works {
// 
//     @SerializedName("works")
//     public List<Work> list;
// }


// Path: app/src/main/java/com/konifar/annict/api/AnnictClient.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.konifar.annict.BuildConfig;
import com.konifar.annict.model.Programs;
import com.konifar.annict.model.Record;
import com.konifar.annict.model.Token;
import com.konifar.annict.model.Works;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
import rx.Observable;

        /**
         * https://annict.wikihub.io/wiki/api/authentication
         */
        @POST("/oauth/token")
        Observable<Token> postOauthToken(
            @Query("client_id") String clientId,
            @Query("client_secret") String clientSecret, @Query("grant_type") String grantType,
            @Query("redirect_uri") String scope, @Query("code") String code
        );

        /**
         * https://annict.wikihub.io/wiki/api/me-programs
         */
        @GET("/v1/me/programs")
        Observable<Programs> getMeProgarms(
            @Query("fields") @Nullable String fields, @Query("filter_ids") @Nullable String filterIds,
            @Query("filter_channel_ids") @Nullable String filterChannelIds,
            @Query("filter_work_ids") @Nullable String filterWorkIds,
            @Query("filter_started_at_gt") @Nullable String filterStartedAtGt,
            @Query("filter_started_at_lt") @Nullable String filterStartedAtLt,
            @Query("filter_unwatched") @Nullable Boolean filterUnwatched,
            @Query("filter_rebroadcast") @Nullable Boolean filterRebroadcast, @Query("page") int page,
            @Query("per_page") int perPage, @Query("sort_id") @Nullable String sortId,
            @Query("sort_started_at") @Nullable String sortStartedAt
        );

        /**
         * https://annict.wikihub.io/wiki/api/me-works
         */
        @GET("/v1/me/works")
        Observable<Works> getMeWorks(