package com.infinite.focus.server.fcm.service;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;

import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.auth.http.HttpTransportFactory;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;

@Service
public class FCMInitializer {

	@Value("${app.firebase-configuration-file}")
	private String firebaseConfigPath;

	Logger logger = LoggerFactory.getLogger(FCMInitializer.class);

	@PostConstruct
	public void initialize() {
		try {
			/*
			 * InetSocketAddress address = new InetSocketAddress("localhost", 8081); final
			 * HttpTransport transport = new NetHttpTransport.Builder() .setProxy(new
			 * Proxy(Proxy.Type.HTTP, address)) .build(); HttpTransportFactory
			 * transportFactory = new HttpTransportFactory() {
			 * 
			 * @Override public HttpTransport create() { return transport; } };
			 */
			// GoogleCredentials googleCredentials = GoogleCredentials.fromStream(new
			// ClassPathResource(firebaseConfigPath).getInputStream(), transportFactory);
			GoogleCredentials googleCredentials = GoogleCredentials
					.fromStream(new ClassPathResource(firebaseConfigPath).getInputStream());

			/*
			 * FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(
			 * googleCredentials) //.setHttpTransport(transport) .setConnectTimeout(2*1000)
			 * .setReadTimeout(3*1000) .build();
			 */
			// FileInputStream serviceAccount = new FileInputStream(firebaseConfigPath);

			FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(googleCredentials)
					.setDatabaseUrl("https://infinite-focus-schools.firebaseio.com").setConnectTimeout(2 * 1000)
					.setReadTimeout(3 * 1000).build();

			if (FirebaseApp.getApps().isEmpty()) {
				FirebaseApp.initializeApp(options);
				logger.info("Firebase application has been initialized");
			}
		} catch (IOException e) {
			logger.error(e.getMessage());
		}
	}
}
