package org.pixsee.fcm;

import com.google.gson.JsonObject;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Converter.Factory;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.Body;
import retrofit2.http.POST;

/**
 * Created by Tudor on 15-Nov-16.
 */
public class Sender {
    private final String serverKey;
    private Interceptor interceptor;
    private OkHttpClient httpClient;
    private Retrofit retrofit;
    private HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();

    public Sender(String serverKey) {
        this.serverKey = serverKey;
        interceptor = createInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
        httpClient = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .addInterceptor(httpLoggingInterceptor)
                .build();
        retrofit = createRetrofit().build();
    }

    private Retrofit.Builder createRetrofit() {
        return createRetrofit(GsonConverterFactory.create());
    }

    private Retrofit.Builder createRetrofit(Factory factory) {
        return new Retrofit.Builder()
                .baseUrl("https://fcm.googleapis.com/fcm/")
                .client(httpClient)
                .addConverterFactory(factory);
    }

    public void setLoggingLevel(HttpLoggingInterceptor.Level level) {
        httpLoggingInterceptor.setLevel(level);
    }

    private Interceptor createInterceptor() {
        return chain -> {
            Request request = chain.request().newBuilder()
                    .header("Authorization", String.format("key=%s", Sender.this.serverKey))
                    .header("content-type", "application/json")
                    .build();
            return chain.proceed(request);
        };
    }

    public void send(Message message) {
        send(message, new EmptyCallback());
    }

    public void send(Message message, Callback callback) {
        retrofit.create(GoogleCSS.class)
                .send(message)
                .enqueue(callback);
    }

    private interface GoogleCSS {
        @POST("send")
        Call<JsonObject> send(@Body Message to);
    }

    private class EmptyCallback implements Callback {
        @Override
        public void onResponse(Call call, Response response) {
            System.out.println(response.body());
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            t.printStackTrace();
        }
    }
}