package com.integralblue.callerid.inject;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.client.RestTemplate;

import roboguice.inject.SharedPreferencesName;

import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
import com.google.inject.name.Names;
import com.integralblue.callerid.CallerIDLookup;
import com.integralblue.callerid.HttpCallerIDLookup;
import com.integralblue.callerid.contacts.ContactsHelper;
import com.integralblue.callerid.geocoder.Geocoder;
import com.integralblue.callerid.geocoder.NominatimGeocoder;

public class CallerIDModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(String.class).annotatedWith(SharedPreferencesName.class).toProvider(PreferencesNameProvider.class).in(Scopes.SINGLETON);
		bind(ContactsHelper.class).toProvider(ContactsHelperProvider.class).in(Scopes.SINGLETON);
		bind(CallerIDLookup.class).to(HttpCallerIDLookup.class).in(Scopes.SINGLETON);
		bind(Geocoder.class).toProvider(GeocoderHelperProvider.class).in(Scopes.SINGLETON);
		bind(NominatimGeocoder.class).in(Scopes.SINGLETON);
		bind(VersionInformationHelper.class).in(Scopes.SINGLETON);
		bind(TextToSpeechHelper.class).in(Scopes.SINGLETON);
		bind(CountryDetector.class).in(Scopes.SINGLETON);
		
		final ObjectMapper jsonObjectMapper = new ObjectMapper();
		jsonObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		bind(ObjectMapper.class).annotatedWith(Names.named(("jsonObjectMapper"))).toInstance(jsonObjectMapper);
		bind(RestTemplate.class).toProvider(RestTemplateProvider.class).in(Scopes.SINGLETON);
		
	}

}