#!/usr/bin/env python3

# . ~/Documents/projects/Olympus/montera/scripts/env_montera/bin/activate

import pandas as pd
import numpy as np
import os
import argparse
import configparser
import sys
import subprocess
import csv
import matplotlib.pyplot as plt
import logging
import time

# For some gneric utiltities: json_read, json_write, timer
import montera.gutil as gutil
import montera.cno_lib as cno_lib
import montera.plot_snr as plot_snr


#def load_az_el_mesh(fname):
#    data = np.load(fname)
#    XX = data['arr_0']
#    YY = data['arr_1']
#    ZZ = data['arr_2']
#    return XX, YY, ZZ


def do_plots(devs, ref_day, days):
    #FIGSIZE = (10, 5)
    for dev in devs:
        print(f'--------------- {ref_day} {dev}')
        for antenna in [0, 1]:
            d = os.path.join(ref_day, 'gen_data', 'snr_csv_and_elev_table', dev)
            fname = os.path.join(d, f'{dev}_{antenna}_az_el.npz')
            if not os.path.isfile(fname):
                print(f'   Skipping reference {fname} (not found)')
                continue
            ref_data = np.load(fname)
            png_fname = os.path.join('figures',
                                     f'az_el_{dev}_{antenna}_{ref_day}.png',
                                     )
            plot_snr.az_el_mesh_plot(ref_data,
                                     png_fname,
                                     #vmin=-20,
                                     #vmax=20,
                                     #cmap=plt.get_cmap('jet'),
                                     color_label='C/No Diff (dB)',
                                     #ylim=[0,90],
                                     )

            for day in days:
                d = os.path.join(day, 'gen_data', 'snr_csv_and_elev_table', dev)
                fname = os.path.join(d, f'{dev}_{antenna}_az_el.npz')
                if not os.path.isfile(fname):
                    print(f'   Skipping {fname} (not found)')
                    continue
                print(f'   Reading {fname}')
                data = np.load(fname)
                png_fname = os.path.join('figures',
                                         f'az_el_{dev}_{antenna}_{day}.png',
                                         )
                plot_snr.az_el_mesh_plot(data,
                                         png_fname,
                                         #vmin=-20,
                                         #vmax=20,
                                         #cmap=plt.get_cmap('jet'),
                                         color_label='C/No Diff (dB)',
                                         #ylim=[0,90],
                                         )

                diff_data = {'xx': data['xx'],
                             'yy': data['yy'],
                             'zz': ref_data['zz'] - data['zz'],
                             }

                png_fname = os.path.join('figures',
                                         f'az_el_diff_{dev}_{antenna}_{ref_day}-{day}.png',
                                         )
                plot_snr.az_el_mesh_plot(diff_data,
                                         png_fname,
                                         vmin=-20,
                                         vmax=20,
                                         #cmap=plt.get_cmap('jet'),
                                         color_label='C/No Diff (dB)',
                                         #ylim=[0,90],
                                         )


def td_html_png(html, fname, fname_short):
    html += '<td class="fft_table">\n'
    if os.path.isfile(fname):
        print(f'   Adding {fname_short}')
        html += f'<a href="{fname_short}">\n'
        html += f'<img src="{fname_short}" width="100%"></a>\n'
    else:
        print(f'   Skipping {fname_short} (not found)')
    html += '</td>\n'
    return html


def gen_html(devs, data_sets):
    html = """<html lang="en">
    <head>
    <style>
    .fft_table {
        border: 1px solid black;
        border-collapse: collapse;
        margin-left: auto;    /* For centering table */
        margin-right: auto;   /* For centering table */
    }
    .fft_table th {
        padding: 0.5rem;
        border-collapse: collapse;
        border: 1px solid black;
    }
    .fft_table td {
        padding: 0.0rem;
        border-collapse: collapse;
        border-bottom: none;
        border-top: none;
    }
    </style>"""
    html += f'<title>{os.getcwd()}</title>'
    html += """</head>
    <body>\n"""

    for ds in data_sets:
        ref_day = ds['ref_day']
        days = ds['days']

        for antenna in [0, 1]:
            for dev in devs:
                html += f'<center><H2>{dev}, Antenna {antenna}</H2></center>'
                html += '<table class="fft_table">\n'

                # --- Table Header ----
                html += '<thead>\n'
                html += f'<tr><th class="fft_table">{ref_day}</th>\n'
                for day in days:
                    html += f'<th class="fft_table">{day}</th>\n'
                html += f'</tr>\n'
                html += '</thead>\n'
                html += '<tbody>\n'

                # --- Raw Az vs El ----
                fname_short = f'az_el_{dev}_{antenna}_{ref_day}.png'
                fname = os.path.join('figures', fname_short)
                html += '<tr>\n'
                html = td_html_png(html, fname, fname_short)

                for day in days:
                    fname_short = f'az_el_{dev}_{antenna}_{day}.png'
                    fname = os.path.join('figures', fname_short)
                    html = td_html_png(html, fname, fname_short)
                html += '</tr>\n'

                # --- Diffs ----
                html += f'<tr><td class="fft_table" align="center">(no diff to ref day)</td>\n' # Empty diff cell
                for day in days:
                    fname_short = f'az_el_diff_{dev}_{antenna}_{ref_day}-{day}.png'
                    fname = os.path.join('figures', fname_short)
                    html = td_html_png(html, fname, fname_short)
                html += '</tr>\n'
                html += '</tbody>\n'
                html += '</table>\n'
    html += '</body>\n'

    html_fname = os.path.join('figures', 'az_el_diff.html')
    print(f'Saving {html_fname}')
    with open(html_fname, 'w') as fhtml:
        fhtml.write(html)

def main():
    total_time = gutil.timer('total')

    parser = argparse.ArgumentParser(
        description='Difference Az El plots',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    gutil.add_common_nargs(parser, 'days')
    gutil.add_common_nargs(parser, 'devs',
                           ['JudoRoof-all', 'P4-03-all', 'P4-05-all'])

    debugp = parser.add_argument_group('Debug options')
    #gutil.add_common_bool(debugp, 'force')
    gutil.add_common_bool(debugp, 'plot')
    gutil.add_common_bool(debugp, 'html')
    gutil.add_verbose(debugp)

    args = parser.parse_args()
    logging.basicConfig(
        level=logging.WARNING - (10 * args.verbose),
        format=gutil.logger_format,
        stream=sys.stdout
    )

    #FIGSIZE = (10, 5)
    data_sets = [
        {'ref_day': '240126_NoAnt_N',
         'days': ['240128_NoAnt_E', '240129_NoAnt_S', '240130_NoAnt_W']
         },
        {'ref_day': '240131_Ant_N',
         'days': ['240201_Ant_E', '240203_Ant_S', '240204_Ant_W'],
             #'240205_Ant_W'
             #'240206_Ant_N'
         }]
    if args.plot:
        print('=============== Plots ===============')
        for ds in data_sets:
            do_plots(args.devs, ds['ref_day'], ds['days'])

    if args.html:
        print('=============== HTML  ===============')
        gen_html(args.devs, data_sets)
        total_time.dt_print()


if __name__ == '__main__':
    main()
