// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.android.libs.discovery.ble;

import android.bluetooth.le.AdvertiseCallback;
import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.BluetoothLeAdvertiser;
import android.util.Log;

import java.nio.ByteBuffer;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;

import io.v.v23.discovery.Service;
import io.v.v23.discovery.VAdvertisement;

public class BlePlugin {
    private Map<Integer, VAdvertisement> mAdvertisements;
    private Map<Integer, VScanner> mScannersById;

    private Map<UUID, VScanner> mScannersByServiceId;

    private BluetoothLeAdvertiser mBluetoothLeAdvertiser;



    private void readvertise() {
        int hash = mAdvertisements.hashCode();

        AdvertiseData.Builder builder = new AdvertiseData.Builder();
        ByteBuffer buf = ByteBuffer.allocate(9);
        buf.put((byte) 8);
        buf.putLong(hash);
        builder.addManufacturerData(1001, buf.array());
        AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
        settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);
        settingsBuilder.setConnectable(true);
                mBluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), builder.build(),
                        new AdvertiseCallback() {
                            @Override
                            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                                super.onStartSuccess(settingsInEffect);
                                Log.i("vanadium", "Successfully started " + settingsInEffect);
                            }

                            @Override
                            public void onStartFailure(int errorCode) {
                                super.onStartFailure(errorCode);
                                Log.i("vanadium", "Failed to start advertising " + errorCode);
                            }
                        });
    }
}