using System;

public enum ActivityType : int {
    Unspecific = 0,
    Automotive = 1,
    Walking = 2,
    Running = 4,
    Cycling = 8,
    Still = 16,
}

public enum WearState : int {
    PlacedProperly = 0,
    PlacedUpsideDown = 1,
    Loose = 2,
    Detached = 3,
    Unknown = 4,
    Unsettled = 5,
}

public enum Exercise : int {
    None = -1,
    PushUp = 0,
    Jump = 1,
    SitUp = 2,
    Burpee = 3,
    PullUp = 4,
    Squat = 5,
    PlankStart = 6,
    PlankEnd = 7,
}

public enum BodyPosition : int {
    Unknown = 0,
    Prone = 1,
    Supine = 2,
    LeftSide = 3,
    RightSide = 4,
}

public enum Signal : int {
    Ecg = 0,
    Respiration = 1,
    Temperature = 2,
    Motion = 3,
    Battery = 4,
    Activity = 5,
    Orientation = 6,
    Steps = 7,
    HeartRate = 8,
    HealthThermometer = 9,
    SoundVolume = 10,
    Rr = 11,
    Pressure = 12,
    RespirationRate = 14,
    BodyPosition = 15,
    Eda = 16,
    Gps = 17,
}

public enum SyncState : int {
    Start = 0,
    End = 1,
    Stop = 2,
    Empty = 3,
    Unavailable = 4,
}

public enum DisconnectReason : int {
    Timeout = 0,
    DeviceDisconnected = 1,
    AppDisconnected = 2,
    SdkOutdated = 3,
    UnknownError = 4,
    DeviceUnsupported = 5,
}

public interface AidlabDelegate {
    void didConnectAidlab(IAidlab aidlab);
    void didDisconnectAidlab(IAidlab aidlab, DisconnectReason reason);

    void didReceiveECG(IAidlab aidlab, Int64 timestamp, float value);
    void didReceiveRespiration(IAidlab aidlab, Int64 timestamp, float value);
    void didReceiveRespirationRate(IAidlab aidlab, Int64 timestamp, int value);
    void didReceiveBatteryLevel(IAidlab aidlab, int stateOfCharge);
    void didReceiveSkinTemperature(IAidlab aidlab, Int64 timestamp, float value);
    void didReceiveAccelerometer(IAidlab aidlab, Int64 timestamp, float ax, float ay, float az);
    void didReceiveGyroscope(IAidlab aidlab, Int64 timestamp, float qx, float qy, float qz);
    void didReceiveMagnetometer(IAidlab aidlab, Int64 timestamp, float mx, float my, float mz);
    void didReceiveQuaternion(IAidlab aidlab, Int64 timestamp, float qw, float qx, float qy, float qz);
    void didReceiveOrientation(IAidlab aidlab, Int64 timestamp, float roll, float pitch, float yaw);

    void didReceiveEDA(IAidlab aidlab, Int64 timestamp, float conductance);
    void didReceiveGPS(IAidlab aidlab, Int64 timestamp, double latitude, double longitude, double altitude, float speed,
                       float heading, float hdop);

    void didReceiveBodyPosition(IAidlab aidlab, Int64 timestamp, BodyPosition bodyPosition);
    void didReceiveActivity(IAidlab aidlab, Int64 timestamp, ActivityType activity);
    void didReceiveSteps(IAidlab aidlab, Int64 timestamp, long value);
    void didReceiveHeartRate(IAidlab aidlab, Int64 timestamp, int heartRate);
    void didReceiveRr(IAidlab aidlab, Int64 timestamp, int rr);
    void didReceivePressure(IAidlab aidlab, Int64 timestamp, int value);
    void pressureWearStateDidChange(IAidlab aidlab, WearState wearState);
    void wearStateDidChange(IAidlab aidlab, WearState wearState);
    void didDetectExercise(IAidlab aidlab, Exercise exercise);

    void didReceiveSoundVolume(IAidlab aidlab, Int64 timestamp, int value);
    void didReceiveSignalQuality(IAidlab aidlab, Int64 timestamp, int value);

    void syncStateDidChange(IAidlab aidlab, SyncState state);
    void didReceiveUnsynchronizedSize(IAidlab aidlab, int unsynchronizedSize, float syncBytesPerSecond);

    void didReceivePastECG(IAidlab aidlab, Int64 timestamp, float value);
    void didReceivePastRespiration(IAidlab aidlab, Int64 timestamp, float value);
    void didReceivePastSkinTemperature(IAidlab aidlab, Int64 timestamp, float value);
    void didReceivePastHeartRate(IAidlab aidlab, Int64 timestamp, int heartRate);
    void didReceivePastRr(IAidlab aidlab, Int64 timestamp, int rr);
    void didReceivePastRespirationRate(IAidlab aidlab, Int64 timestamp, int value);
    void didReceivePastActivity(IAidlab aidlab, Int64 timestamp, ActivityType activity);
    void didReceivePastSteps(IAidlab aidlab, Int64 timestamp, long value);
    void didReceivePastAccelerometer(IAidlab aidlab, Int64 timestamp, float ax, float ay, float az);
    void didReceivePastGyroscope(IAidlab aidlab, Int64 timestamp, float qx, float qy, float qz);
    void didReceivePastMagnetometer(IAidlab aidlab, Int64 timestamp, float mx, float my, float mz);
    void didReceivePastQuaternion(IAidlab aidlab, Int64 timestamp, float qw, float qx, float qy, float qz);
    void didReceivePastOrientation(IAidlab aidlab, Int64 timestamp, float roll, float pitch, float yaw);
    void didReceivePastEDA(IAidlab aidlab, Int64 timestamp, float conductance);
    void didReceivePastGPS(IAidlab aidlab, Int64 timestamp, double latitude, double longitude, double altitude, float speed,
                           float heading, float hdop);
    void didReceivePastBodyPosition(IAidlab aidlab, Int64 timestamp, BodyPosition bodyPosition);
    void didReceivePastSoundVolume(IAidlab aidlab, Int64 timestamp, int value);
    void didReceivePastPressure(IAidlab aidlab, Int64 timestamp, int value);
    void didReceivePastSignalQuality(IAidlab aidlab, Int64 timestamp, int value);
    void didDetectPastUserEvent(Int64 timestamp);

    void didReceivePayload(IAidlab aidlab, string process, byte[] payload);
    void didReceiveError(string error);
}
