package eu.rampsoftware.er.di;

import android.content.Context;

import javax.inject.Named;
import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import eu.rampsoftware.er.data.CurrencyRepository;
import eu.rampsoftware.er.data.PreferencesData;
import eu.rampsoftware.er.data.datasource.CurrencyDataSource;
import eu.rampsoftware.er.data.datasource.local.DatabaseCurrencyDataSource;
import eu.rampsoftware.er.data.datasource.remote.CurrencyDataApi;
import eu.rampsoftware.er.data.datasource.remote.RetrofitCurrencyDataSource;
import eu.rampsoftware.er.data.preferences.SharedPreferencesData;
import eu.rampsoftware.er.data.repository.CachingCurrencyRepository;
import eu.rampsoftware.er.properties.ApplicationProperties;
import eu.rampsoftware.er.properties.ResourcesApplicationProperties;

/**
 * Dagger module responsible for providing {@link ApplicationComponent} scope dependencies.
 */
@Module
public class ApplicationModule implements IApplicationModule {

    private final Context mContext;

    public ApplicationModule(Context context){
        mContext = context;
    }

    @Override
    @Provides
    @Named("example")
    @Singleton
    public String provideExampleString() {
        return "Production Example";
    }

    @Override
    @Provides
    @Singleton
    public Context provideContext(){
        return mContext;
    }

    @Override
    @Provides
    @Singleton
    public ApplicationProperties provideApplicationProperties(final Context context){
        return new ResourcesApplicationProperties(context);
    }

    @Override
    @Provides
    @Singleton
    @Named("remote")
    public CurrencyDataSource provideRemoteCurrencyDataSource(ApplicationProperties properties, final CurrencyDataApi currencyDataApi){
        return new RetrofitCurrencyDataSource(currencyDataApi, properties.getOerAppId());
    }

    @Override
    @Provides
    @Singleton
    @Named("local")
    public CurrencyDataSource provideLocalCurrencyDataSource(){
        return new DatabaseCurrencyDataSource();
    }

    @Override
    @Provides
    @Singleton
    public CurrencyRepository provideCurrencyRepository(@Named("local") final CurrencyDataSource localSource,
                                                        @Named("remote") final CurrencyDataSource remoteSource){
        return new CachingCurrencyRepository(localSource, remoteSource);
    }

    @Provides
    @Singleton
    @Override
    public PreferencesData providePreferencesData(ApplicationProperties properties){
        return new SharedPreferencesData(mContext.getSharedPreferences(
                properties.sharedPreferencesName(), Context.MODE_PRIVATE));
    }
}