#pragma once
#include <Arduino.h>
#include <arduinoFFT.h>
#include "PhiAudio.h"

/*
 ===========================================================
    MODULE PhiScientificModel
    Scientific analysis IMU + Audio
    
    FEATURES:
    • Audio vs EMI classification by spectral flatness
    • Automatic signal type detection
    • 8-band spectrum (0-1000 Hz) for harmonic visualization
    • Vibro-acoustic coupling normalized [0,1]
 ===========================================================
*/

class PhiScientificModel {
public:
    PhiScientificModel();

    void begin(size_t fftSize, float fsIMU, float fsAUD);
    void process(const float* imuBuf, const float* audioBuf);

    // Scientific outputs
    float energyIMU()   const { return _eIMU; }  // Dominant IMU spectral amplitude
    float energyAUD()   const { return _eAUD; }  // Dominant Audio spectral amplitude
    float freqIMU()     const { return _fIMU; }  // Dominant IMU frequency (Hz)
    float freqAUD()     const { return _fAUD; }  // Dominant Audio frequency (Hz)
    float couplingScore() const { return _corr; } // Vibro-acoustic coupling [0,1]
    
    // Audio/EMI classification
    PhiAudio::AudioType getAudioType() const { return _audioType; }
    float getSpectralFlatness() const { return _spectralFlatness; }
    bool isEMI() const { return _audioType == PhiAudio::TYPE_EMI; }
    bool isAudio() const { return _audioType == PhiAudio::TYPE_AUDIO; }
    
    // 8-band spectrum (0-1000 Hz) for harmonic visualization
    void getSpectrum8Bands(uint8_t* bands) const;

private:
    size_t _fftSize;
    float _fsIMU;
    float _fsAUD;

    float* _im_real;
    float* _im_imag;
    float* _au_real;
    float* _au_imag;
    float* _hann;

    ArduinoFFT<float>* _fftIMU;
    ArduinoFFT<float>* _fftAUD;

    float _eIMU, _eAUD;  // Dominant spectral amplitudes
    float _fIMU, _fAUD;  // Dominant frequencies
    float _corr;         // Vibro-acoustic coupling [0,1]
    
    PhiAudio::AudioType _audioType;
    float _spectralFlatness;
    PhiAudio::AudioType _previousAudioType;

    float _dominantFreq(const float* mag, float fs);
    float _dominantAmplitude(const float* mag);  // ✓ Renamed (was _dominantEnergy)
    float _computeCorrelation(float f1, float f2, float e1, float e2);
    void _classifyAudio();
    float _computeSpectralFlatness(const float* spectrum, size_t n);
};