#!/usr/bin/python3

import pandas as pd
import matplotlib.pyplot as plt
import argparse
import sys
import os
import logging
import subprocess

from plot_sat_set_change import calc_changes_and_plot
#import pos_stats

def main():
    parser = argparse.ArgumentParser(
        description='Plot sat changes in FOLDER/outputs/titan/DEV/',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    parser.add_argument(
        '--heading_folder',
        #default='240918_montera',   #'.',
        default='240918_el0',   #'.',
        help='Root dir containing T04 Files.',
        )
    parser.add_argument(
        '--sats_folder',
        default='240918_ant0',   #'.',
        help='Root dir containing T04 Files.',
        )
    parser.add_argument(
        '--heading_dev',
        default='BX992',
        help='Device name for heading.',
        )
    parser.add_argument(
        '-D', '--devs',
        type=str,
        nargs='+',
        default=['EB1-5093', 'EB1-5095',
                 'EB-5081',
                 'P4-05', 'BX992'],
        help="List of dev directories, will be used as FOLDER/day/data/gnss/DEV"
             "If None, then scan FOLDER/day/data/gnss/ for dev directories that "
             "do not start with '.' or '_'. "
             "Example: -D BXLVL JudoRoof P4-05 MS956",
        )
    parser.add_argument(
        "--force",
        action=argparse.BooleanOptionalAction,
        default=False,
        help="Run the counting algorithm, even if the .csv exists"
    )
    parser.add_argument(
        "--verbose", "-v",
        action='count',
        default=0,
        help="use multiple -v for more detailed messages."
    )

    logger_format = (
            #"[%(asctime)s][%(levelname)-8s]"
            "[%(levelname)-8s]"
            "[%(filename)11s:%(lineno)-5s] "
            "%(funcName)-10s: %(message)s"
            )
    args = parser.parse_args()
    logging.basicConfig(
        level=logging.WARNING - (10 * args.verbose),
        format=logger_format,
        stream=sys.stdout
    )
    logging.debug(args)

    # ---------------------------------
    #   Get Heading
    # ---------------------------------
    heading_fname = os.path.join(args.heading_folder, 'outputs', 
                            f'{args.heading_dev}_heading.feather')
    if not os.path.isfile(heading_fname) or args.force:
        cmd_list = ['pos_stats', args.heading_folder, f'{args.heading_dev}_all.T04']
        print(' '.join(cmd_list))
        #f = open(log_path, 'w')
        p = subprocess.run(cmd_list,
                           #stderr=subprocess.STDOUT, stdout=f,
                           )
        #f.close()
        if p.returncode != 0:
            print(f'*** WARNING *** pos_stats ({dev}) return code {p.returncode}')

    df_heading = pd.read_feather(heading_fname,
                                 columns=['Week', 'Time', 'adj_time',
                                          'heading', 'corrAge',
                                          #'hprec', 'vprec', 'dist',
                                          ],
                                 )

    fig, ax = plt.subplots(3, 1,
                       figsize=(20, 7),
                       height_ratios=[3, 2, 1],
                       layout="constrained",
                       )
    fig2, f2ax = plt.subplots(len(args.devs), 1,
                       figsize=(20, 7),
                       #height_ratios=[3, 2, 1],
                       layout="constrained",
                       )
    for n_dev, dev in enumerate(args.devs):

        # ---------------------------------
        #   Get SV Changes
        # ---------------------------------
        sat_fname = os.path.join(args.sats_folder, 'outputs', 'titan',
                                dev, f'TitanPlayer_{dev}_sat_changes.csv')
        titan_log_filename = os.path.join(args.sats_folder, 'outputs', 'titan',
                                dev, f'TitanPlayer_{dev}.log')
        if os.path.isfile(sat_fname) and not args.force:
            df_sats = pd.read_csv(sat_fname)
        else:
            df_sats = calc_changes_and_plot(titan_log_filename, False, False)

        df = pd.merge(df_sats, df_heading, 'inner', on='Time')

        # ---------------------------------
        #   Make Plots
        # ---------------------------------
        ax[0].plot(df.Time, df.n_sat_changes, '.', markersize=4, label=dev)
        ax[1].plot(df.Time, df.n_sats_used, '.', markersize=4, label=dev)

        f2ax[n_dev].plot(df.heading, df.n_sat_changes, '.', markersize=4, label=dev)
        f2ax[n_dev].legend()
        f2ax[n_dev].set_ylim([0,8])
        f2ax[n_dev].set_yticks(range(0, 9, 2))
        f2ax[n_dev].set_xticks(range(0, 361, 30))
        f2ax[n_dev].grid(True)


    ax[2].plot(df.Time, df.heading, '.', markersize=4, label=dev)
    ax[2].legend(bbox_to_anchor=(1.04, 0.5), loc="center left", borderaxespad=0,
              markerscale=4.,
              )

    ax[0].set_title(f'{args.sats_folder} Number of Satellite Changes')
    #plt.legend(args.devs)
    #ax.legend(bbox_to_anchor=(1.1, 1.05))
    ax[0].legend(bbox_to_anchor=(1.04, 0.5), loc="center left", borderaxespad=0,
              markerscale=4.,
              )
    #f2ax.legend(bbox_to_anchor=(1.04, 0.5), loc="center left", borderaxespad=0,
    #          markerscale=4.,
    #          )
    #ax[0].set_ylabel('Num Sats (per system) Changed')
    ax[0].set_ylabel('Num Sats Changed')
    ax[1].set_ylabel('Num Sats Used')
    ax[2].set_ylabel('Heading (deg)')
    ax[2].set_xlabel('Time (s)')
    ax[0].grid(True)
    ax[1].grid(True)
    ax[2].grid(True)
    #ax[3].grid(True)

    ax[1].set_ylim([0, 35])
    ax[1].set_yticks(range(0, 36, 5))

    png_fname = os.path.join(args.sats_folder, f'sat_changes.png')
    print(f'Saving {png_fname}')
    fig.savefig(png_fname)

    png_fname = os.path.join(args.sats_folder, f'sat_changes_vs_az.png')
    print(f'Saving {png_fname}')
    fig2.savefig(png_fname)

    plt.show()
    plt.close()


if __name__ == '__main__':
    main()
