package com.adafruit.bluefruit.le.connect.ble;


import com.adafruit.bluefruit.le.connect.app.UartInterfaceActivity;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class KnownUUIDs extends StandardUUIDs {

    // Service UUIDs
    private static final Map<String, String> sServiceUUIDs;

    static {
        Map<String, String> aMap = new HashMap<>();

        aMap.put("0000febb-0000-1000-8000-00805f9b34fb".toUpperCase(), "Adafruit Unified Sensor");
        aMap.put(UartInterfaceActivity.UUID_SERVICE.toUpperCase(), "Nordic UART");
        aMap.put("00001530-1212-efde-1523-785feabcd123".toUpperCase(), "Nordic Device Firmware Update Service");
        aMap.put("ee0c2080-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone-URL Config Service");
        aMap.put("8D53DC1D-1DB7-4CD3-868B-8A527460AA84".toUpperCase(), "Newtmgr Service");

        sServiceUUIDs = Collections.unmodifiableMap(aMap);
    }

    // Characteristic UUIDs
    private static final Map<String, String> sCharacteristicUUIDs;

    static {
        Map<String, String> aMap = new HashMap<>();

        // Unified
        aMap.put("B71E0102-7E57-4AFE-EB1E-5CA1AB1E1DEA".toUpperCase(), "Static Sensor Info");
        aMap.put("B71E0103-7E57-4AFE-EB1E-5CA1AB1E1DEA".toUpperCase(), "Dynamic Sensor Info");
        aMap.put("b71e0104-7e57-4afe-eb1e-5ca1ab1e1dea".toUpperCase(), "Sensor Data");
        aMap.put("00002a24-0000-1000-8000-00805f9b34fb".toUpperCase(), "Model Number");
        aMap.put("00001530-1212-efde-1523-785feabcd123".toUpperCase(), "Nordic Device Firmware Update Service");

        // DFU
        aMap.put("00001532-1212-efde-1523-785feabcd123".toUpperCase(), "DFU Packet");
        aMap.put("00001531-1212-efde-1523-785feabcd123".toUpperCase(), "DFU Control Point");
        aMap.put("00001534-1212-efde-1523-785feabcd123".toUpperCase(), "DFU Version");

        // Uart
        aMap.put(UartInterfaceActivity.UUID_RX.toUpperCase(), "RX Buffer");
        aMap.put(UartInterfaceActivity.UUID_TX.toUpperCase(), "TX Buffer");
        aMap.put(UartInterfaceActivity.UUID_DFU.toUpperCase(), "DFU Service");

        // Eddystone
        aMap.put("ee0c2081-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Lock State");
        aMap.put("ee0c2082-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Lock");
        aMap.put("ee0c2083-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Unlock");
        aMap.put("ee0c2084-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone URI Data");
        aMap.put("ee0c2085-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Flags");
        aMap.put("ee0c2086-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Adv. TX Power Levels");
        aMap.put("ee0c2087-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone TX Power Mode");
        aMap.put("ee0c2088-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Beacon Period");
        aMap.put("ee0c2089-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone Reset");
        aMap.put("ee0c2090-8786-40ba-ab96-99b91ac981d8".toUpperCase(), "Eddystone (Reserved)");

        // Newtmgr
        aMap.put("DA2E7828-FBCE-4E01-AE9E-261174997C48".toUpperCase(), "Newtmgr Characteristic");

        sCharacteristicUUIDs = Collections.unmodifiableMap(aMap);
    }

    // Descriptors UUIDs
    private static final Map<String, String> sDescriptorUUIDs;

    static {
        Map<String, String> aMap = new HashMap<>();

        sDescriptorUUIDs = Collections.unmodifiableMap(aMap);
    }


    // Public Getters
    public static String getServiceName(String uuid) {
        String result;

        uuid = uuid.toUpperCase();  // To avoid problems with lowercase/uppercase
        result = sServiceUUIDs.get(uuid);
        if (result == null) {
            result = StandardUUIDs.getServiceName(uuid);
        }

        return result;
    }

    public static String getCharacteristicName(String uuid) {
        String result;

        uuid = uuid.toUpperCase();  // To avoid problems with lowercase/uppercase
        result = sCharacteristicUUIDs.get(uuid);
        if (result == null) {
            result = StandardUUIDs.getCharacteristicName(uuid);
        }

        return result;
    }

    public static String getDescriptorName(String uuid) {
        String result;

        uuid = uuid.toUpperCase();  // To avoid problems with lowercase/uppercase
        result = sDescriptorUUIDs.get(uuid);
        if (result == null) {
            result = StandardUUIDs.getDescriptorName(uuid);
        }

        return result;
    }
}
