// =============================================================================
// TudadaAccelerometerSensor
//
// 가속도계 센서 싱글톤 인스턴스 (내부 관리)
// TudadaSDK.Instance.StartAccelerometerSensor()로 센싱을 시작합니다.
//
// 사용 예시:
// TudadaSDK.Instance.OnAccelerometerChange += (res) => Debug.Log($"X:{res.x} Y:{res.y} Z:{res.z}");
// TudadaSDK.Instance.StartAccelerometerSensor(AccelerometerSensitivity.sensitive);
// TudadaSDK.Instance.StopAccelerometerSensor();
// =============================================================================

using System;
using UnityEngine;
using Tudada;
using Tudada.Internal;

/// <summary>
/// 가속도계 센서 내부 싱글톤 인스턴스
/// 외부에서 직접 생성하지 않으며, TudadaSDK가 내부적으로 관리합니다.
/// </summary>
internal class TudadaAccelerometerSensor
{
    #region Singleton

    private static TudadaAccelerometerSensor _instance;

    /// <summary>
    /// 싱글톤 인스턴스 획득 (없으면 생성)
    /// </summary>
    internal static TudadaAccelerometerSensor GetOrCreateInstance()
    {
        if (_instance == null)
        {
            _instance = new TudadaAccelerometerSensor();
        }
        return _instance;
    }

    /// <summary>
    /// 싱글톤 인스턴스 조회 (내부용)
    /// </summary>
    internal static TudadaAccelerometerSensor GetInstance()
    {
        return _instance;
    }

    #endregion

    #region Properties

    /// <summary>
    /// 현재 민감도 설정
    /// </summary>
    public AccelerometerSensitivity Sensitivity { get; private set; }

    /// <summary>
    /// 센서 활성 상태
    /// </summary>
    public bool IsListening { get; private set; }

    #endregion

    #region Events

    /// <summary>
    /// 가속도 변화 이벤트
    /// </summary>
    public event Action<AccelerometerChangeResult> OnChange;

    #endregion

    #region Constructor

    private TudadaAccelerometerSensor()
    {
        Sensitivity = AccelerometerSensitivity.normal;
        IsListening = false;
        LogDebug("Instance created");
    }

    #endregion

    #region Internal Methods

    /// <summary>
    /// 센싱 시작 완료 처리 (내부용)
    /// </summary>
    internal void SetListening(bool listening, AccelerometerSensitivity sensitivity = AccelerometerSensitivity.normal)
    {
        IsListening = listening;
        if (listening)
        {
            Sensitivity = sensitivity;
        }
    }

    /// <summary>
    /// 가속도 변화 이벤트 트리거 (jslib에서 호출)
    /// </summary>
    internal void TriggerOnChange(AccelerometerChangeResult result)
    {
        OnChange?.Invoke(result);
    }

    #endregion

    #region Helper Methods

    private void LogDebug(string message)
    {
        Debug.Log($"{Constants.ACCELEROMETER_LOG_PREFIX} {message}");
    }

    #endregion
}
