package com.willowtreeapps.androidinstantappsdemo.data.remote;

import android.arch.lifecycle.LiveData;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ValueEventListener;
import com.willowtreeapps.androidinstantappsdemo.data.model.Cart;
import com.willowtreeapps.androidinstantappsdemo.data.model.Catalog;
import com.willowtreeapps.androidinstantappsdemo.data.model.JoinedCart;

/**
 * Created by willowtree on 5/11/17.
 */
class FirebaseCartLiveData extends LiveData<Cart> {

    private final DatabaseReference cartReference;
    private final DatabaseReference catalogReference;
    private Cart cart;
    private Catalog catalog;

    private final ValueEventListener cartListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            cart = dataSnapshot.getValue(Cart.class);
            onDataChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            onDatabaseError(databaseError);
        }
    };
    private final ValueEventListener catalogListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            catalog = dataSnapshot.getValue(Catalog.class);
            onDataChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            onDatabaseError(databaseError);
        }
    };


    public FirebaseCartLiveData(DatabaseReference cartReference, DatabaseReference catalogReference) {
        this.cartReference = cartReference;
        this.catalogReference = catalogReference;
    }

    @Override
    protected void onActive() {
        super.onActive();
        cartReference.addValueEventListener(cartListener);
        catalogReference.addValueEventListener(catalogListener);
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        cartReference.removeEventListener(cartListener);
        catalogReference.removeEventListener(catalogListener);
    }

    private void onDataChanged() {
        if (cart == null || catalog == null) {
            return; // need both values
        }
        setValue(new JoinedCart(cart, catalog));
    }

    private void onDatabaseError(DatabaseError databaseError) {
    }

}