package nl.sense_os.service.constants;

import nl.sense_os.service.MsgHandler;
import nl.sense_os.service.storage.LocalStorage;
import android.content.ContentResolver;
import android.provider.BaseColumns;

/**
 * Utiliy class that contains resources for representing sensor data points.
 * 
 * @author Steven Mulder <steven@sense-os.nl>
 * 
 * @see LocalStorage
 * @see MsgHandler
 */
public class SensorData {

    /**
     * Column names for Cursors that represent a set of buffered data points for a certain sensor.
     */
    public static class BufferedData implements BaseColumns {

        public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
                + "/vnd.sense_os.buffered_data";
        public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
                + "/vnd.sense_os.buffered_data";

        public static final String SENSOR = "sensor";
        public static final String ACTIVE = "active";
        public static final String JSON = "json";

        private BufferedData() {
            // class should not be instantiated
        }
    }

    /**
     * Column names for Cursors that represent a sensor data point.
     */
    public static class DataPoint implements BaseColumns {

        public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
                + "/vnd.sense_os.data_point";
        public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
                + "/vnd.sense_os.data_point";
        public static final String CONTENT_URI_PATH = "/recent_values";
        @Deprecated
        public static final String CONTENT_PERSISTED_URI_PATH = "/persisted_values";
        public static final String CONTENT_REMOTE_URI_PATH = "/remote_values";

        /**
         * The name of the sensor that generated the data point. <br>
         * <br>
         * TYPE: String
         */
        public static final String SENSOR_NAME = "sensor_name";
        /**
         * Description of the sensor that generated the data point. Can either be the hardware name,
         * or any other useful description. <br>
         * <br>
         * TYPE: String
         */
        public static final String SENSOR_DESCRIPTION = "sensor_description";
        /**
         * The data type of the data point. <br>
         * <br>
         * TYPE: String
         * 
         * @see SenseDataTypes
         */
        public static final String DATA_TYPE = "data_type";
        /**
         * The human readable display name of the sensor that generated the data point. <br>
         * <br>
         * TYPE: String
         * 
         * @see SenseDataTypes
         */
        public static final String DISPLAY_NAME = "display_name";
        /**
         * Time stamp for the data point, in milliseconds. <br>
         * <br>
         * TYPE: long
         */
        public static final String TIMESTAMP = "timestamp";
        /**
         * Data point value. <br>
         * <br>
         * TYPE: String
         */
        public static final String VALUE = "value";
        /**
         * Value path
         * Type: String
         */
        public static final String VALUE_PATH = "value_path";
        /**
         * Transmit state of the data point, signalling whether the point has been sent to
         * CommonSense already.<br>
         * <br>
         * TYPE: integer status code: 0 (not sent), or 1 (sent)
         */
        public static final String TRANSMIT_STATE = "transmit_state";
        /**
         * Device UUID of the sensor. Use this for sensors that are originated from
         * "external sensors", or leave <code>null</code> to use the phone as default device.<br>
         * <br>
         * TYPE: String
         */
        public static final String DEVICE_UUID = "device_uuid";

        private DataPoint() {
            // class should not be instantiated
        }
    }

    /**
     * Standard names for sensors.
     * 
     * @see DataPoint#SENSOR_NAME
     */
    public static class SensorNames {

        /**
         * Fall detector sensor. Can be a real fall or a regular free fall for demo's. Part of the
         * Motion sensors.
         */
        public static final String FALL_DETECTOR = "fall_detector";

        /** Noise level sensor. Part of the Ambience sensors. */
        public static final String NOISE = "noise_sensor";
        
        /** Noise level sensor (Burst-mode). Part of the Ambience sensors. */
        public static final String NOISE_BURST = "noise_sensor (burst-mode)";

        /** Audio spectrum sensor. Part of the Ambience sensors. */
        public static final String AUDIO_SPECTRUM = "audio_spectrum";

        /** Microphone output. Part of the Ambience sensors (real-time mode only). */
        public static final String MIC = "microphone";

        /** Light sensor. Part of the Ambience sensors. */
        public static final String LIGHT = "light";

        /** Camera Light sensor. Part of the Ambience sensors. */
        public static final String CAMERA_LIGHT = "camera_light";

        /** Bluetooth discovery sensor. Part of the Neighboring Devices sensors. */
        public static final String BLUETOOTH_DISCOVERY = "bluetooth_discovery";

        /** Wi-Fi scan sensor. Part of the Neighboring Devices sensors. */
        public static final String WIFI_SCAN = "wifi scan";

        /** NFC sensor. Part of the Neighboring Devices sensors. */
        public static final String NFC_SCAN = "nfc_scan";

        /** Acceleration sensor. Part of the Motion sensors, also used in Zephyr BioHarness */
        public static final String ACCELEROMETER = "accelerometer";

        /** Motion sensor. The basis for the other Motion sensors. */
        public static final String MOTION = "motion";

        /** Linear acceleration sensor name. Part of the Motion sensors. */
        public static final String LIN_ACCELERATION = "linear acceleration";

        /** Gyroscope sensor name. Part of the Motion sensors. */
        public static final String GYRO = "gyroscope";

        /** Magnetic field sensor name. Part of the Ambience sensors. */
        public static final String MAGNETIC_FIELD = "magnetic field";

        /** Orientation sensor name. Part of the Motion sensors. */
        public static final String ORIENT = "orientation";

        /** Epi-mode accelerometer sensor. Special part of the Motion sensors. */
        public static final String ACCELEROMETER_EPI = "accelerometer (epi-mode)";

        /** Burst-mode accelerometer sensor. Special part of the Motion sensors. */
        public static final String ACCELEROMETER_BURST = "accelerometer (burst-mode)";

        /** Burst-mode gyroscope sensor. Special part of the Motion sensors. */
        public static final String GYRO_BURST = "gyroscope (burst-mode)";

        /** Burst-mode linear acceleration sensor. Special part of the Motion sensors. */
        public static final String LINEAR_BURST = "linear acceleration (burst-mode)";

        /** Motion energy sensor name. Special part of the Motion sensors. */
        public static final String MOTION_ENERGY = "motion energy";

        /*** battery sensor for Zephyr BioHarness external sensor */
        public static final String BATTERY_LEVEL = "battery level";

        /** heart rate sensor for Zephyr BioHarness and HxM external sensors */
        public static final String HEART_RATE = "heart rate";

        /** respiration rate sensor for Zephyr BioHarness external sensor */
        public static final String RESPIRATION = "respiration rate";

        /** temperature sensor for Zephyr BioHarness external sensor */
        public static final String TEMPERATURE = "temperature";

        /** worn status for Zephyr BioHarness external sensor */
        public static final String WORN_STATUS = "worn status";

        /** blood pressure sensor */
        public static final String BLOOD_PRESSURE = "blood_pressure";

        /** reaction time sensor */
        public static final String REACTION_TIME = "reaction_time";

        /** speed sensor for Zephyr HxM external sensor */
        public static final String SPEED = "speed";

        /** distance sensor for Zephyr HxM external sensor */
        public static final String DISTANCE = "distance";

        /** battery sensor for Zephyr HxM external sensor */
        public static final String BATTERY_CHARGE = "battery charge";

        /** strides sensor (stappenteller) for Zephyr HxM external sensor */
        public static final String STRIDES = "strides";

        /** Location sensor. */
        public static final String LOCATION = "position";

        /** Battery sensor. Part of the Phone State sensors. */
        public static final String BATTERY_SENSOR = "battery sensor";

        /** Screen activity sensor. Part of the Phone State sensors. */
        public static final String SCREEN_ACTIVITY = "screen activity";

        /** Pressure sensor. Part of the Phone State sensors. */
        public static final String PRESSURE = "pressure";

        /** Proximity sensor. Part of the Phone State sensors. */
        public static final String PROXIMITY = "proximity";

        /** Call state sensor. Part of the Phone State sensors. */
        public static final String CALL_STATE = "call state";

        /** Data connection state sensor. Part of the Phone State sensors. */
        public static final String DATA_CONN = "data connection";

        /** IP address sensor. Part of the Phone State sensors. */
        public static final String IP_ADDRESS = "ip address";

        /** Mobile service state sensor. Part of the Phone State sensors. */
        public static final String SERVICE_STATE = "service state";

        /** Mobile signal strength sensor. Part of the Phone State sensors. */
        public static final String SIGNAL_STRENGTH = "signal strength";

        /** Unread messages sensor. Part of the Phone State sensors. */
        public static final String UNREAD_MSG = "unread msg";

        /** Data connection type sensor. Part of the Phone State sensors. */
        public static final String CONN_TYPE = "connection type";

        /** Monitor status since DTCs cleared. Part of the OBD-II sensors. */
        public static final String MONITOR_STATUS = "monitor status";

        /** Fuel system status. Part of the OBD-II sensors. */
        public static final String FUEL_SYSTEM_STATUS = "fuel system status";

        /** Calculated engine load. Part of the OBD-II sensors. */
        public static final String ENGINE_LOAD = "calculated engine load value";

        /** Engine coolant. Part of the OBD-II sensors. */
        public static final String ENGINE_COOLANT = "engine coolant";

        /** Short/Long term fuel trim bank 1 & 2. Part of the OBD-II sensors. */
        public static final String FUEL_TRIM = "fuel trim";

        /** Fuel Pressure. Part of the OBD-II sensors. */
        public static final String FUEL_PRESSURE = "fuel pressure";

        /** Intake manifold absolute pressure. Part of the OBD-II sensors. */
        public static final String INTAKE_PRESSURE = "intake manifold absolute pressure";

        /** Engine RPM. Part of the OBD-II sensors. */
        public static final String ENGINE_RPM = "engine RPM";

        /** Vehicle speed. Part of the OBD-II sensors. */
        public static final String VEHICLE_SPEED = "vehicle speed";

        /** Timing advance. Part of the OBD-II sensors. */
        public static final String TIMING_ADVANCE = "timing advance";

        /** Intake air temperature. Part of the OBD-II sensors. */
        public static final String INTAKE_TEMPERATURE = "intake air temperature";

        /** MAF air flow rate. Part of the OBD-II sensors. */
        public static final String MAF_AIRFLOW = "MAF air flow rate";

        /** Throttle position. Part of the OBD-II sensors. */
        public static final String THROTTLE_POSITION = "throttle position";

        /** Commanded secondary air status. Part of the OBD-II sensors. */
        public static final String AIR_STATUS = "commanded secondary air status";

        /** Oxygen sensors. Part of the OBD-II sensors. */
        public static final String OXYGEN_SENSORS = "oxygen sensors";

        /** OBD standards. Part of the OBD-II sensors. */
        public static final String OBD_STANDARDS = "OBD standards";

        /** Auxiliary input status. Part of the OBD-II sensors. */
        public static final String AUXILIARY_INPUT = "auxiliary input status";

        /** Run time since engine start. Part of the OBD-II sensors. */
        public static final String RUN_TIME = "run time";

        /** Ambient temperature sensor. Part of the ambience sensors. From API >= 14 only */
        public static final String AMBIENT_TEMPERATURE = "ambient_temperature";

        /** Relative humidity sensor. Part of the ambience sensors. From API >= 14 only */
        public static final String RELATIVE_HUMIDITY = "relative_humidity";

        /** Bluetooth number of neighbours, count sensor */
        public static final String BLUETOOTH_NEIGHBOURS_COUNT = "bluetooth neighbours count";

        /** Traveled distance for each day */
        public static final String TRAVELED_DISTANCE_24H = "traveled distance 24h";

        /** Traveled distance for each hour */
        public static final String TRAVELED_DISTANCE_1H = "traveled distance 1h";

        public static final String LOUDNESS = "loudness";

        public static final String ATTACHED_TO_MYRIANODE = "attachedToMyriaNode";

        public static final String APP_INSTALLED = "installed_apps";
        
        public static final String APP_FOREGROUND = "foreground_app";
        
        private SensorNames() {
            // class should not be instantiated
        }
    }

    /**
     * Standard descriptions for sensors.
     * 
     * @see DataPoint#SENSOR_DESCRIPTION
     */
    public static class SensorDescriptions {
        /**
         * Auto-calibrated noise level sensor. Part of the Ambience sensors.
         */
        public static final String AUTO_CALIBRATED = "auto-calibrated";
    }

    private SensorData() {
        // do not instantiate
    }
}
