package com.shareable.beacon;

import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.shareable.Constants;

import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;

import java.io.UnsupportedEncodingException;
import java.util.Collection;

public class Receiver extends Beacons implements BeaconConsumer {
    BeaconManager beaconManager = null;
    Handler mHandler;
    Promise mPromise;
    ReactApplicationContext mContext;

    public Receiver(ReactApplicationContext context, Handler handler, Promise promise) {
        super(context);
        beaconManager = BeaconManager.getInstanceForApplication(context);
        mHandler = handler;
        mPromise = promise;
        mContext = context;
    }

    @Override
    public void onStart() {

        try {
            beaconManager.getBeaconParsers().clear();
            beaconManager.getBeaconParsers().add(cusParser);

            beaconManager.setForegroundBetweenScanPeriod(6000l);

            beaconManager.bind(this);

            mPromise.resolve("Scan started");
        } catch (Exception e) {
            mPromise.reject("Error", "Unable to start scan");
        }
    }

    @Override
    public void onStart(String message, BeaconStates callback) { }

    @Override
    public void onStop() {
        beaconManager.unbind(this);
        beaconManager = null;
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.removeAllRangeNotifiers();
        beaconManager.addRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
                for (Beacon beacon : collection) {
                    if(beacon.getId1().equals(MY_MATCHING_IDENTIFIER)) {
                        byte[] bytes = beacon.getId2().toByteArray();
                        String message = null;
                        try {
                            message = new String(bytes, 0, bytes.length, "ASCII");
                        } catch (UnsupportedEncodingException e) {
                            Message msg = mHandler.obtainMessage(Constants.ON_DECODEBYTE_ERROR);
                            mHandler.sendMessage(msg);
                            return;
                        }
                        Message msg = mHandler.obtainMessage(Constants.ON_DECODEBYTE_SUCCESS);
                        Bundle value = new Bundle();
                        value.putString("value", message);
                        msg.setData(value);
                        mHandler.sendMessage(msg);
                    }
                }
            }
        });

        try {
            beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {    }
    }
}
