package o2mc.io.dimmldependency.Datastreams;

import android.app.Activity;
import android.util.Log;

import org.json.JSONObject;

import java.util.ArrayList;

/**
 * Created by nickyromeijn on 30/03/16.
 * This class handles the dispatching of data
 * All gathered tracking data passes through one of the two dispatch methods
 */
public class DatastreamsDispatcher {

    private Activity context;
    private DatastreamsSettings settings;

    private DatastreamsHandler datastreamsHandler;
    private int batchCounter = 0;
    public boolean postInProgress;
    private ArrayList<JSONObject> dataContainers = new ArrayList<>();
    private JSONObject generalInfo;
    private int dispatchThreshhold = 5;

    public DatastreamsDispatcher(DatastreamsHandler datastreamsHandler) {
        this.settings = datastreamsHandler.getSettings();
        this.datastreamsHandler = datastreamsHandler;
    }

    public void update(Activity activity, JSONObject generalInfo) {
        context = activity;
        this.generalInfo = generalInfo;
    }

    /**
     * Used to set dispatchThreshold, when x datacontainers have been gathered send data to endpoint
     * @param threshhold
     */
    public void setDispatchThreshhold(int threshhold) {
        this.dispatchThreshhold = threshhold;
    }

    public void dispatch(DataContainer dataContainer) {
        dataContainers.add(dataContainer.asJson());

        if (dataContainers.size() > dispatchThreshhold) {
            if (!postInProgress) {
                if (settings.OnlySendWhenWifi()) {
                    if (Connectivity.getConnectivityType(context) == "WIFI") {
                        new DatastreamsPost(this, generalInfo).execute(dataContainers);
                        postInProgress = true;
                    }
                } else {
                    new DatastreamsPost(this, generalInfo).execute(dataContainers);
                    postInProgress = true;
                }

            }
        }

        Log.e("DATA", dataContainer.asString());
    }

    /**
     * This method is derived from the void Dispatch() method but instead of adhering to a threshold it dispatches
     * everything it has gathered up untill now.
     * @param generalInfo
     */
    public void dispatchNow(JSONObject generalInfo) {
        if (!postInProgress && dataContainers.size() > 0) {
            if (settings.OnlySendWhenWifi()) {
                if (Connectivity.getConnectivityType(context) == "WIFI") {
                    new DatastreamsPost(this, generalInfo).execute(dataContainers);
                    postInProgress = true;
                }
            } else {
                new DatastreamsPost(this, generalInfo).execute(dataContainers);
                postInProgress = true;
            }

        }
    }

    public DatastreamsHandler getDatastreamsHandler() {
        return datastreamsHandler;
    }

    public DatastreamsSettings getSettings() {
        return settings;
    }

    public int getBatchCounter() {
        return batchCounter;
    }

    public void callback() {
        dataContainers.clear();
        batchCounter += 1;
        postInProgress = false;
    }
}
