import cv2
import sys
import numpy as np
from scipy.interpolate import interp1d
from scipy.signal import medfilt
import matplotlib.pyplot as plt

CONFIG = {}
DIVE132 = {}
DIVE132['start_timestamp'] = 78415070.265000
DIVE132['start_unixtime'] = 1565963063
DIVE133 = {}
DIVE133['start_timestamp'] = 166770625.173600
DIVE133['start_unixtime'] = 1566051418

def parse_particleproc3d_line(line):

    data = np.zeros((1, 11))

    for ind, tok in enumerate(line.split(',')):
        if ind == 0:
            data[0, ind] = float(tok.split('-')[1])
        else:
            data[0, ind] = float(tok)

    return data

def build_stats_data(stats_file, type='ParticleProc3D'):

    with open(stats_file, "r") as f:
        lines = f.readlines()

    if type=='ParticleProc3D':

        COLS = 11

        data = np.zeros((len(lines), COLS))
        for i, line in enumerate(lines):
            data[i, :] = parse_particleproc3d_line(line)

        return data

def parse_mini_rov_line(line):
    # Example: 1565962637.856,4.156,15.285,5.302,33.521,-68.889,0.000
    data = np.zeros((1, 7))
    for i, tok in enumerate(line.split(",")):
        data[0, i] = float(tok)
    return data

def build_ctd_data(log_file, data_source="MiniROV"):

    with open(log_file, "r") as f:
        lines = f.readlines()

    # strip out header
    while lines[0][0] == "#":
        lines = lines[1:]

    if data_source == "MiniROV":

        COLS = 7

        data = np.zeros((len(lines), COLS))
        for i, line in enumerate(lines):
            data[i, :] = parse_mini_rov_line(line)

        # Interp data to every second
        x = data[:, 0]
        new_x = np.arange(int(data[0, 0])-1, int(data[-1, 0])+1, 1)

        data_new = np.zeros((len(new_x), COLS))

        # interp data 4x
        for col in range(0, COLS):
            y = data[:, col]
            f = interp1d(x, y, fill_value="extrapolate")
            data_new[:, col] = f(new_x)

        return data_new

def colate_data(log_data, stats_data, cfg):

    log_start_time = cfg['start_unixtime']
    log_offset = np.squeeze(np.argwhere(log_data[:, 0] == log_start_time))

    output_data = np.zeros((stats_data.shape[0], log_data.shape[1] + stats_data.shape[1]))

    for ind in range(0,stats_data.shape[0]):
        log_index = int(log_offset + (stats_data[ind][0] - cfg['start_timestamp'])/1000)
        output_data[ind, :] = np.concatenate((log_data[log_index, :], stats_data[ind][:]))

    return output_data


if __name__=="__main__":

    # collate data for AGU2020

    plt.style.use('dark_background')

    if False:
        log_files = ['X:\\800139.EyeRIS\\EyeRIS.Software\\EyeRISConvert\\data\\CTD_081619124840.txt',
        'X:\\800139.EyeRIS\\EyeRIS.Software\\EyeRISConvert\\data\\CTD_081719135359.txt']
        stats_files = ['E:\\EyeRISTransectExport\\proc_8_16\stats\\basic_stats.csv',
                       'E:\\EyeRISTransectExport\\proc_8_17\stats\\basic_stats.csv']

        DIVES = [DIVE132, DIVE133]

        for ind, log_file in enumerate(log_files):

            log_data = build_ctd_data(log_file)
            stats_data = build_stats_data(stats_files[ind])

            out = colate_data(log_data, stats_data, DIVES[ind])

            nn_rms = np.sqrt(out[:, 17]/(2*np.pi*out[:, 16]**2))

            plt.plot(medfilt(nn_rms, 23), out[:, 3])
            plt.ylim(1000, 50)

            np.savetxt(stats_files[ind]+'.collated.csv', out)

        plt.grid(True)
        plt.legend(['Dive 132 (High Productivity)', 'Dive 133 (Lower Productivity)'])
        plt.show()

    # plot data for AGU2020
    if True:

        h = 15
        a1 = 20*20
        a2 = 25*25
        volume_estimte = h/3*(a1+a2 + np.sqrt(a1*a2))/1000 # in liters

        print("Volume: " + str(volume_estimte))
    
        aug16_log = np.loadtxt('E:\\EyeRISTransectExport\\proc_8_16\\stats\\basic_stats.csv.collated.csv')
        aug16_nnstats = np.loadtxt('E:\\EyeRISTransectExport\\proc_8_16\\clouds_nn_stats.csv')
        aug17_log = np.loadtxt('E:\\EyeRISTransectExport\\proc_8_17\\stats\\basic_stats.csv.collated.csv')
        aug17_nnstats = np.loadtxt('E:\\EyeRISTransectExport\\proc_8_17\\clouds_nn_stats.csv')

        # aug16
        inds = aug16_nnstats[:, 0].astype(int)
        plt.semilogx(medfilt(aug16_nnstats[:, 1], 23)/volume_estimte, aug16_log[inds, 3], color='mediumseagreen', linewidth=2)
        inds = aug17_nnstats[:, 0].astype(int)
        plt.semilogx(medfilt(aug17_nnstats[:, 1], 23)/volume_estimte, aug17_log[inds, 3], color='cornflowerblue', linewidth=2)
        plt.grid(True)
        plt.legend(['Surf Chl ~ 50 mg/m^2', 'Surf Chl ~ 5 mg/m^2'], bbox_to_anchor=(0., 1.02, 1., .102), loc='lower left',
           ncol=2, mode="expand", borderaxespad=0., fontsize=12)
        plt.ylim(1000, 50)
        plt.xlim((0, 1000))
        plt.xlabel('Particle Concentration (#/l)', fontsize=12)
        plt.ylabel('Pressure (dBar)', fontsize=12)
        
        plt.show()




