import pandas as pd
import numpy as np

from minmax import MinMaxFrequencyDetector
from HPF import SimpleHighPassFilter
from LPF import SimpleLowPassFilter
        
def doubleFilterAndRR(df, cutoffLPF, cutoffHPF, amp, cutoffRR,  samplePeriod, columnRR):
    df[columnRR] = 0.0

    nasalLPF1 = SimpleLowPassFilter(cutoffLPF,samplePeriod, amp)
    nasalLPF2 = SimpleLowPassFilter(cutoffLPF,samplePeriod, amp)
    nasalHPF1 = SimpleHighPassFilter(cutoffHPF,samplePeriod, amp)
    nasalHPF2 = SimpleHighPassFilter(cutoffHPF,samplePeriod, amp)
    oralLPF1  = SimpleLowPassFilter(cutoffLPF,samplePeriod, amp)
    oralLPF2  = SimpleLowPassFilter(cutoffLPF,samplePeriod, amp)
    oralHPF1  = SimpleHighPassFilter(cutoffHPF,samplePeriod, amp)
    oralHPF2  = SimpleHighPassFilter(cutoffHPF,samplePeriod, amp)
    rrLPF1 = SimpleLowPassFilter(cutoffRR,samplePeriod, 1.0)

    mmfd = MinMaxFrequencyDetector()
    
    for index, row in df.iterrows():
        # Filter Nasal
        filteredNasal = row['tempNasal']
        filteredNasal = nasalLPF1.getFilteredSample(filteredNasal)
        filteredNasal = nasalLPF2.getFilteredSample(filteredNasal)
        filteredNasal = nasalHPF1.getFilteredSample(filteredNasal)
        filteredNasal = nasalHPF2.getFilteredSample(filteredNasal)

        # Filter Oral
        filteredOral = row['tempOral']
        filteredOral = oralLPF1.getFilteredSample(filteredOral)
        filteredOral = oralLPF2.getFilteredSample(filteredOral)
        filteredOral = oralHPF1.getFilteredSample(filteredOral)
        filteredOral = oralHPF2.getFilteredSample(filteredOral)

        signal = 0.5*filteredNasal +0.5*filteredOral

        mmfd.pushNewSample(row['timeSeconds'], signal)

        periodMax = 60.0/8
        periodMin = 60.0/100

        mmfdPeriod = mmfd.getPeriodTminSec()
        
        if(mmfdPeriod < periodMin):
            signalPeriodSec = periodMin
        elif(periodMax < mmfdPeriod):
            signalPeriodSec = periodMax
        else:
            signalPeriodSec = mmfdPeriod
        signalFrequencyBpm = 60/signalPeriodSec

        filteredRR = signalFrequencyBpm
        filteredRR = rrLPF1.getFilteredSample(filteredRR)

        if mmfd.getIsSignalTmin(5.0, 2):
            df.at[index, columnRR] = filteredRR
        else:
            df.at[index, columnRR] = 8.0



def RRAlgotrithm(fileName):

    # Parameters
    SAMPLE_PERIOD = 0.04 # Seconds
    CUTOFF_FREQ_LPF = 1.0
    CUTOFF_FREQ_HPF = 0.3
    AMP = 3.5
    RR_CUTOFF_FREQ = 0.12

    df = pd.read_csv(fileName)
    df.drop(['dateTime','signalPeriodSec', 'test', 'false'], axis=1, errors='ignore', inplace=True)
    df.rename(columns={'signalFrequencyBpm': 'signalFrequencyBpmPhone'}, inplace=True)

    doubleFilterAndRR(df, CUTOFF_FREQ_LPF, CUTOFF_FREQ_HPF, AMP, RR_CUTOFF_FREQ, SAMPLE_PERIOD, 'signalFrequencyBpmPython')
    
    df.to_csv(fileName, index=False, float_format="%.4f")
    df.to_csv(fileName+'.gz', index=False, float_format="%.4f", compression='gzip')
    return df




