// src/sensors/DeviceTracking.ts

import { Accelerometer, Gyroscope, DeviceMotion, Magnetometer } from 'expo-sensors';

export interface SensorData {
  x: number;
  y: number;
  z: number;
}

export class DeviceTracking {
  private accelerometerSubscription: any = null;
  private gyroscopeSubscription: any = null;
  private deviceMotionSubscription: any = null;
  private magnetometerSubscription: any = null;

  public accelerometerData: SensorData | null = null;
  public gyroscopeData: SensorData | null = null;
  public deviceMotionData: any = null;
  public magnetometerData: SensorData | null = null;

  startAccelerometer(interval: number = 100): void {
    Accelerometer.setUpdateInterval(interval);
    this.accelerometerSubscription = Accelerometer.addListener(data => {
      this.accelerometerData = data;
    });
  }

  stopAccelerometer(): void {
    if (this.accelerometerSubscription) {
      this.accelerometerSubscription.remove();
      this.accelerometerSubscription = null;
    }
  }

  startGyroscope(interval: number = 100): void {
    Gyroscope.setUpdateInterval(interval);
    this.gyroscopeSubscription = Gyroscope.addListener(data => {
      this.gyroscopeData = data;
    });
  }

  stopGyroscope(): void {
    if (this.gyroscopeSubscription) {
      this.gyroscopeSubscription.remove();
      this.gyroscopeSubscription = null;
    }
  }

  startDeviceMotion(interval: number = 100): void {
    DeviceMotion.setUpdateInterval(interval);
    this.deviceMotionSubscription = DeviceMotion.addListener(data => {
      this.deviceMotionData = data;
    });
  }

  stopDeviceMotion(): void {
    if (this.deviceMotionSubscription) {
      this.deviceMotionSubscription.remove();
      this.deviceMotionSubscription = null;
    }
  }

  startMagnetometer(interval: number = 100): void {
    Magnetometer.setUpdateInterval(interval);
    this.magnetometerSubscription = Magnetometer.addListener(data => {
      this.magnetometerData = data;
    });
  }

  stopMagnetometer(): void {
    if (this.magnetometerSubscription) {
      this.magnetometerSubscription.remove();
      this.magnetometerSubscription = null;
    }
  }

  stopAllSensors(): void {
    this.stopAccelerometer();
    this.stopGyroscope();
    this.stopDeviceMotion();
    this.stopMagnetometer();
  }
}