// Path: app/src/main/java/info/izumin/android/sunazuri/domain/repository/OauthRepository.java
// public interface OauthRepository {
//     Single<AuthorizedUser> getToken(String code);
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/repository/TeamsRepository.java
// public interface TeamsRepository {
//     Single<List<Team>> get(AuthorizedUser user);
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/repository/UsersRepository.java
// public interface UsersRepository {
//     Observable<AuthorizedUser> getCurrentUser();
//     Single<List<AuthorizedUser>> getAuthorizedUsers();
//     Observable<LoginInfo> getLoginInfo();
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/api/ApiModule.java
// @Module
// public class ApiModule {
//     public static final String TAG = ApiModule.class.getSimpleName();
// 
//     private final String apiEndpoint;
//     private final OauthParams oauthParams;
//     private final List<String> responseEnvelopKeys;
// 
//     public ApiModule(String apiEndpoint, OauthParams oauthParams, List<String> responseEnvelopKeys) {
//         this.apiEndpoint = apiEndpoint;
//         this.oauthParams = oauthParams;
//         this.responseEnvelopKeys = responseEnvelopKeys;
//     }
// 
//     @Provides
//     @Singleton
//     EnvelopeTypeAdapterFactory envelopeTypeAdapterFactory() {
//         return new EnvelopeTypeAdapterFactory(responseEnvelopKeys);
//     }
// 
//     @Provides
//     @Singleton
//     Gson gson(EnvelopeTypeAdapterFactory envelopeTypeAdapterFactory) {
//         return new GsonBuilder()
//                 .registerTypeAdapterFactory(StaticGsonTypeAdapterFactory.newInstance())
//                 .registerTypeAdapterFactory(envelopeTypeAdapterFactory)
//                 .create();
//     }
// 
//     @Provides
//     @Singleton
//     Retrofit retrofit(OkHttpClient client, Gson gson) {
//         return new Retrofit.Builder()
//                 .client(client)
//                 .baseUrl(apiEndpoint)
//                 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//                 .addConverterFactory(GsonConverterFactory.create(gson))
//                 .build();
//     }
// 
//     @Provides
//     @Singleton
//     OauthApi oauthApi(Retrofit retrofit) {
//         return retrofit.create(OauthApi.class);
//     }
// 
//     @Provides
//     @Singleton
//     TeamsApi teamsApi(Retrofit retrofit) {
//         return retrofit.create(TeamsApi.class);
//     }
// 
//     @Provides
//     @Singleton
//     UsersApi usersApi(Retrofit retrofit) {
//         return retrofit.create(UsersApi.class);
//     }
// 
//     @Provides
//     @Singleton
//     OauthParams oauthParams() {
//         return oauthParams;
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/cache/CacheModule.java
// @Module
// public class CacheModule {
//     public static final String TAG = CacheModule.class.getSimpleName();
// 
//     @Provides
//     @Singleton
//     LoginCache loginCache(LoginCacheImpl cache) {
//         return cache;
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/entity/OauthParams.java
// public class OauthParams {
//     public static final String TAG = OauthParams.class.getSimpleName();
// 
//     public final String endpoint;
//     public final String clientId;
//     public final String clientSecret;
//     public final String redirectUri;
//     public final String scope;
//     public final String responseType;
//     public final String authorizePath;
//     public final String grantType;
// 
//     public OauthParams(String endpoint, String clientId, String clientSecret, String redirectUri, String scope, String responseType, String authorizePath, String grantType) {
//         this.endpoint = endpoint;
//         this.clientId = clientId;
//         this.clientSecret = clientSecret;
//         this.redirectUri = redirectUri;
//         this.scope = scope;
//         this.responseType = responseType;
//         this.authorizePath = authorizePath;
//         this.grantType = grantType;
//     }
// 
//     public String getAuthorizeUri() {
//         return endpoint + authorizePath
//                 + "?client_id="     + clientId
//                 + "&redirect_uri="  + redirectUri
//                 + "&scope="         + scope
//                 + "&response_type=" + responseType;
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/repository/RepositoryModule.java
// @Module(
//         includes = {
//                 OauthRepositoryModule.class,
//                 TeamsRepositoryModule.class
//         }
// )
// public class RepositoryModule {
//     public static final String TAG = RepositoryModule.class.getSimpleName();
// 
//     @Provides
//     @Singleton
//     UsersRepository usersRepository(UsersRepositoryImpl repo) {
//         return repo;
//     }
// }


import dagger.Component;
import info.izumin.android.sunazuri.domain.repository.OauthRepository;
import info.izumin.android.sunazuri.domain.repository.TeamsRepository;
import info.izumin.android.sunazuri.domain.repository.UsersRepository;
import info.izumin.android.sunazuri.infrastructure.api.ApiModule;
import info.izumin.android.sunazuri.infrastructure.cache.CacheModule;
import info.izumin.android.sunazuri.infrastructure.entity.OauthParams;
import info.izumin.android.sunazuri.infrastructure.repository.RepositoryModule;
import okhttp3.OkHttpClient;
import javax.inject.Singleton;
package info.izumin.android.sunazuri.infrastructure;



/**
 * Created by izumin on 5/13/2016 AD.
 */
@Singleton
@Component(
        modules = {
                InfrastructureModule.class,
                RepositoryModule.class,
                HttpClientModule.class,
                ApiModule.class,
                CacheModule.class
        }
)
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/repository/OauthRepository.java
// public interface OauthRepository {
//     Single<AuthorizedUser> getToken(String code);
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/repository/TeamsRepository.java
// public interface TeamsRepository {
//     Single<List<Team>> get(AuthorizedUser user);
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/repository/UsersRepository.java
// public interface UsersRepository {
//     Observable<AuthorizedUser> getCurrentUser();
//     Single<List<AuthorizedUser>> getAuthorizedUsers();
//     Observable<LoginInfo> getLoginInfo();
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/api/ApiModule.java
// @Module
// public class ApiModule {
//     public static final String TAG = ApiModule.class.getSimpleName();
// 
//     private final String apiEndpoint;
//     private final OauthParams oauthParams;
//     private final List<String> responseEnvelopKeys;
// 
//     public ApiModule(String apiEndpoint, OauthParams oauthParams, List<String> responseEnvelopKeys) {
//         this.apiEndpoint = apiEndpoint;
//         this.oauthParams = oauthParams;
//         this.responseEnvelopKeys = responseEnvelopKeys;
//     }
// 
//     @Provides
//     @Singleton
//     EnvelopeTypeAdapterFactory envelopeTypeAdapterFactory() {
//         return new EnvelopeTypeAdapterFactory(responseEnvelopKeys);
//     }
// 
//     @Provides
//     @Singleton
//     Gson gson(EnvelopeTypeAdapterFactory envelopeTypeAdapterFactory) {
//         return new GsonBuilder()
//                 .registerTypeAdapterFactory(StaticGsonTypeAdapterFactory.newInstance())
//                 .registerTypeAdapterFactory(envelopeTypeAdapterFactory)
//                 .create();
//     }
// 
//     @Provides
//     @Singleton
//     Retrofit retrofit(OkHttpClient client, Gson gson) {
//         return new Retrofit.Builder()
//                 .client(client)
//                 .baseUrl(apiEndpoint)
//                 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//                 .addConverterFactory(GsonConverterFactory.create(gson))
//                 .build();
//     }
// 
//     @Provides
//     @Singleton
//     OauthApi oauthApi(Retrofit retrofit) {
//         return retrofit.create(OauthApi.class);
//     }
// 
//     @Provides
//     @Singleton
//     TeamsApi teamsApi(Retrofit retrofit) {
//         return retrofit.create(TeamsApi.class);
//     }
// 
//     @Provides
//     @Singleton
//     UsersApi usersApi(Retrofit retrofit) {
//         return retrofit.create(UsersApi.class);
//     }
// 
//     @Provides
//     @Singleton
//     OauthParams oauthParams() {
//         return oauthParams;
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/cache/CacheModule.java
// @Module
// public class CacheModule {
//     public static final String TAG = CacheModule.class.getSimpleName();
// 
//     @Provides
//     @Singleton
//     LoginCache loginCache(LoginCacheImpl cache) {
//         return cache;
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/entity/OauthParams.java
// public class OauthParams {
//     public static final String TAG = OauthParams.class.getSimpleName();
// 
//     public final String endpoint;
//     public final String clientId;
//     public final String clientSecret;
//     public final String redirectUri;
//     public final String scope;
//     public final String responseType;
//     public final String authorizePath;
//     public final String grantType;
// 
//     public OauthParams(String endpoint, String clientId, String clientSecret, String redirectUri, String scope, String responseType, String authorizePath, String grantType) {
//         this.endpoint = endpoint;
//         this.clientId = clientId;
//         this.clientSecret = clientSecret;
//         this.redirectUri = redirectUri;
//         this.scope = scope;
//         this.responseType = responseType;
//         this.authorizePath = authorizePath;
//         this.grantType = grantType;
//     }
// 
//     public String getAuthorizeUri() {
//         return endpoint + authorizePath
//                 + "?client_id="     + clientId
//                 + "&redirect_uri="  + redirectUri
//                 + "&scope="         + scope
//                 + "&response_type=" + responseType;
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/repository/RepositoryModule.java
// @Module(
//         includes = {
//                 OauthRepositoryModule.class,
//                 TeamsRepositoryModule.class
//         }
// )
// public class RepositoryModule {
//     public static final String TAG = RepositoryModule.class.getSimpleName();
// 
//     @Provides
//     @Singleton
//     UsersRepository usersRepository(UsersRepositoryImpl repo) {
//         return repo;
//     }
// }


// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/InfrastructureComponent.java
import dagger.Component;
import info.izumin.android.sunazuri.domain.repository.OauthRepository;
import info.izumin.android.sunazuri.domain.repository.TeamsRepository;
import info.izumin.android.sunazuri.domain.repository.UsersRepository;
import info.izumin.android.sunazuri.infrastructure.api.ApiModule;
import info.izumin.android.sunazuri.infrastructure.cache.CacheModule;
import info.izumin.android.sunazuri.infrastructure.entity.OauthParams;
import info.izumin.android.sunazuri.infrastructure.repository.RepositoryModule;
import okhttp3.OkHttpClient;
import javax.inject.Singleton;

package info.izumin.android.sunazuri.infrastructure;



/**
 * Created by izumin on 5/13/2016 AD.
 */
@Singleton
@Component(
        modules = {
                InfrastructureModule.class,
                RepositoryModule.class,
                HttpClientModule.class,
                ApiModule.class,
                CacheModule.class
        }
)
public interface InfrastructureComponent {