"""
Abhängigkeiten:
- scipy.signal (find_peaks)

Autor: Ihr Name
Datum: Erstellungs- oder Änderungsdatum
Version: Modulversion
"""

from scipy import signal

def find_heart_rate(fft, freqs, freq_min, freq_max):
    """
    Berechnet die Herzfrequenz aus den FFT-Spitzen.

    Diese Funktion nimmt FFT-Daten, Frequenzen, sowie minimale und maximale Frequenzgrenzen entgegen. Sie identifiziert die
    Spitzen im FFT-Spektrum, findet die Spitze mit der höchsten Amplitude in einem bestimmten Frequenzband und berechnet
    die Herzfrequenz basierend auf dieser Spitze.

    Args:
    fft (ndarray): Die FFT-Daten des Videos.
    freqs (ndarray): Die Frequenzen, die den FFT-Daten zugeordnet sind.
    freq_min (float): Die untere Grenzfrequenz des zu berücksichtigenden Frequenzbands.
    freq_max (float): Die obere Grenzfrequenz des zu berücksichtigenden Frequenzbands.

    Returns:
    float: Die berechnete Herzfrequenz in Schlägen pro Minute (bpm).
    """
    fft_maximums = []
    # Bestimme die Amplitude an jedem Frequenzpunkt
    for i in range(fft.shape[0]):
        if freq_min <= freqs[i] <= freq_max:
            fftMap = abs(fft[i])
            fft_maximums.append(fftMap.max())
        else:
            fft_maximums.append(0)


    print("fft_maximums: "+str(len(fft_maximums)))
    peaks, properties = signal.find_peaks(fft_maximums)
    print("peaks: "+str(len(peaks)))
    # Liste zur Speicherung der Top-10-Peak-Frequenzen
    top_peak_freqs = []

    # Sortiere die Peaks nach ihrer Amplitude
    sorted_peaks = sorted(peaks, key=lambda x: fft_maximums[x], reverse=True)
    print("sorted_peaks: "+str(len(sorted_peaks)))
    # Wähle die Top-10-Peaks aus
    for peak in sorted_peaks[:100]:
        top_peak_freqs.append(freqs[peak])

    # Berechne den Durchschnitt der Frequenzen der Top-10-Peaks
    if top_peak_freqs:
        average_freq = sum(top_peak_freqs) / len(top_peak_freqs)
        return average_freq * 60# Umrechnung von Hz in BPM
    else:
        return None

# Beispielaufruf der Funktion
# heart_rate = find_heart_rate(fft_data, frequency_data, freq_min, freq_max)