#include "PhiBarometer.h"

/*
 ===========================================================
    PhiBarometer.cpp — Détection variations atmosphériques
    
    CORRECTION APPLIQUÉE: ×10 pour conversion kPa → hPa
 ===========================================================
*/

PhiBarometer::PhiBarometer()
: _pressure(0),
  _deltaPressure(0),
  _baseline(0),
  _calibrated(false),
  _lpf(0.05f)  // Lissage lent (α=0.05, ~2s temps réponse)
{}

bool PhiBarometer::begin() {
    // BARO.begin() doit avoir été appelé avant dans setup()
    // LPS22HB est auto-initialisé avec le bus I2C Wire1

    Serial.println("✔ PhiBarometer initialisé (LPS22HB, ×10 correction)");
    return true;
}

void PhiBarometer::calibrateBaseline(uint16_t samples) {
    Serial.print("🌡️  Calibration baseline pression (");
    Serial.print(samples);
    Serial.println(" échantillons)...");

    float sum = 0;
    uint16_t validSamples = 0;

    for (uint16_t i = 0; i < samples; i++) {
        // CORRECTION: Multiplier par 10 (librairie retourne kPa)
        float p = BARO.readPressure() * 10.0f;
        
        if (p > 0) {  // Vérifier lecture valide
            sum += p;
            validSamples++;
        }
        delay(10);  // 100 Hz max rate
    }

    if (validSamples > 0) {
        _baseline = sum / validSamples;
        _calibrated = true;

        Serial.print("   Baseline: ");
        Serial.print(_baseline, 2);
        Serial.println(" hPa");
        
        // Estimation altitude (formule barométrique simplifiée)
        float altitude = 44330.0 * (1.0 - pow(_baseline / 1013.25, 0.1903));
        Serial.print("   Altitude: ~");
        Serial.print(altitude, 0);
        Serial.println(" m");
        
        Serial.println("   ✅ Calibration OK");
    } else {
        Serial.println("   ❌ Calibration échec (LPS22HB non disponible)");
    }
}

void PhiBarometer::update() {
    // CORRECTION: Multiplier par 10 (librairie retourne kPa)
    float p = BARO.readPressure() * 10.0f;
    
    if (p <= 0) return;  // Lecture invalide

    // Lissage exponentiel
    _pressure = _lpf.step(p);

    // Delta vs baseline (perturbations météo)
    if (_calibrated) {
        _deltaPressure = _pressure - _baseline;
    } else {
        _deltaPressure = 0;
    }
}

float PhiBarometer::relativeAltitude() const {
    if (!_calibrated) return 0;
    
    // Formule barométrique simplifiée
    // Δh ≈ -44330 × (P/P₀)^0.1903 + 44330
    // Pour petites variations: Δh ≈ 8.3 m/hPa
    
    return -8.3f * _deltaPressure;  // mètres
}