# Import some packages
#import os

import sys
import numpy as np
import pandas as pd
# import scipy.signal as sc
# import matplotlib.pyplot as plt
#from custom_realtime_algorithms import SimpleLowPassFilter, SimpleHighPassFilter, MinMaxFrequencyDetector, SimpleRollingMeanFilter


def estimateONratio(signalTime, signalOral, signalNasal, N_window =30, alpha=0.75, flagPlot=False ):
    # Function for estimating the Oral/Nasal (O/N) breathing ratio
    # Assumes signal data has a sampling rate of 10 Hz
    #
    # Some definitions
    #   signalTime: np.array with time signal data in seconds
    #   signalOral: np.array with oral temperature signal in degrees Celcius
    #   signalNasal: np.array with nasal temperature signal in degrees Celcius
    #   N_window: size of the moving window used for DC and RMS calculations (default = 30, which implies a window of 3 seconds)
    #   alpha: reduction factor for Oral AC RMS signal to decide between prue oral and oral exp/nasal insp cases
    
    
    # compute AC / DC temperature signals
    N = len(signalTime)

    # Option 3 for DC: use moving average for DC signal
    signalNasalDC, signalOralDC = np.zeros(N), np.zeros(N)
    for i in range(N_window,N):
        signalOralDC[i] = np.mean(signalOral[i-N_window:i])
        signalNasalDC[i] = np.mean(signalNasal[i-N_window:i])
    
    # compute AC and plot AC & DC signals
    
    signalNasalAC = signalNasal - signalNasalDC
    signalOralAC = signalOral - signalOralDC
        
    # compute moving RMS continuous time for AC signal
    signalOralACrms = np.zeros(N)
    signalNasalACrms = np.zeros(N)
    
    if (N_window > 2*N): print('Error: Acquisition time is too short. Try longer activity times')
    
    for i in range(2*N_window,N):
        window_OralAC = signalOralAC[i-N_window:i]
        window_NasalAC = signalNasalAC[i-N_window:i]
        
        signalOralACrms[i] = np.sqrt(1/N_window*np.sum(window_OralAC**2))
        signalNasalACrms[i] =  np.sqrt(1/N_window*np.sum(window_NasalAC**2))    
    
    # plt.figure()
    i_start = 2*N_window # needed to avoid spurious signal in the beginning
    
    # Classification algorithm
    signalOralSwitch,signalNasalSwitch = np.zeros(N), np.zeros(N)
    
    alpha = 0.850  # AC signal threshold in %
    
    for i in range(i_start,N):
        if (signalNasalDC[i] > signalOralDC[i]):    #Pure nasal breathing
            signalOralSwitch[i] = 0.0
            signalNasalSwitch[i] = 1.0
        else:
     
            if( signalNasalACrms[i] < alpha*signalOralACrms[i] ) : # Pure oral breathing 
                signalOralSwitch[i] = 1.0
                signalNasalSwitch[i] = 0.0
            else:   # Nasal Insp / Oral exp
                signalOralSwitch[i] = 0.0
                signalNasalSwitch[i] = 1.0           
            
    # pad switch signals with initial value
    signalOralSwitch[0:i_start] = signalOralSwitch[i_start]
    signalNasalSwitch[0:i_start] = signalNasalSwitch[i_start]
    
    # Compute Oral ratio
    OralRatio = np.mean(signalOralSwitch)
  
    return OralRatio
 

#print(sys.argv)
if len(sys.argv) > 1:
    filename = sys.argv[1]
#    print(filename)
else:
    print('Error: file name not given as input')

df = pd.read_csv(filename, header=2).iloc[:-100]

# define variable names
colTime, colTempOral, colTempNasal, colPeriod, colFreq = 'timeSeconds', 'tempOral', 'tempNasal', 'signalPeriodSec', 'signalFrequencyBpm'
signalTime, signalNasal, signalOral = df[colTime].to_numpy(), df[colTempNasal].to_numpy(), df[colTempOral].to_numpy()

OralRatio = estimateONratio(signalTime, signalOral, signalNasal)

print(OralRatio)
