#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# migrated from svplot
import argparse
import logging
import os

try:
    import imaspy as imas
except ImportError:
    import imas
from rich_argparse import RichHelpFormatter

from idstools.compute.common import get_nearest_time
from idstools.compute.spectrometer_visible import SpectrometerVisibleCompute
from idstools.database import DBMaster
from idstools.utils.clihelper import (
    dbentry_parser,
    get_database_path,
    get_file_name,
    get_title,
    rcparam_parser,
)
from idstools.utils.idslogger import setup_logger
from idstools.view.common import PlotCanvas
from idstools.view.spectrometer_visible import SpectrometerVisibleView

logger = setup_logger("module", stdout_level=logging.INFO)
if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="---- Display spectrum from spectrometer_visible [previsouly known as svplot]",
        parents=[dbentry_parser, rcparam_parser],
        formatter_class=RichHelpFormatter,
    )

    parser.add_argument("-t", "--time", help="Time", required=False, type=float, default=-99.0)
    parser.add_argument(
        "--logscale",
        help="Shows y axis with logarithmic scale wherever appropriate",
        action="store_true",
    )
    parser.add_argument(
        "--save",
        help="Save figure at default location",
        action="store_true",
    )
    parser.add_argument(
        "--directory",
        help="Directory to save the figure",
        default=None,
    )
    args = parser.parse_args()

    connection = DBMaster.get_connection(args)
    if connection is None:
        exit(1)

    ids_spectrometer_visible = None
    try:

        if args.dd_update:
            ids_spectrometer_visible = connection.get("spectrometer_visible", autoconvert=False)
            ids_spectrometer_visible = imas.convert_ids(ids_spectrometer_visible, connection.factory.version)
        else:
            ids_spectrometer_visible = connection.get("spectrometer_visible", lazy=True, autoconvert=False)
    except Exception as e:
        logger.error(f"spectrometer_visible ids is not present, detailed error: {e}")
        exit(1)

    time_array = ids_spectrometer_visible.time
    time_index, time_value = get_nearest_time(time_array, args.time)

    sv_compute = SpectrometerVisibleCompute(ids_spectrometer_visible)
    spectrometers_list = sv_compute.get_valid_spectrometers()
    total_spectrometers = len(spectrometers_list)

    sv_view = SpectrometerVisibleView(ids_spectrometer_visible)
    columns = 3
    if total_spectrometers / 3 == total_spectrometers // 3:
        rows = int(total_spectrometers / 3)
    else:
        rows = int(total_spectrometers / 3) + 1
    canvas_radiance = PlotCanvas(rows, columns)
    canvas_radiance.update_style(args.rc)
    row_counter = 0
    column_counter = 0

    for spectro_index in spectrometers_list:
        ax = canvas_radiance.add_axes(title="", xlabel="", row=row_counter, col=column_counter, colspan=1)
        column_counter = column_counter + 1
        if column_counter == 3:
            column_counter = 0
            row_counter = row_counter + 1
        radiance_file_name = sv_view.view_radiance(ax, spectro_index, logscale=args.logscale)
        if column_counter != 0:
            ax.get_legend().remove()

    canvas_radiance.fig.subplots_adjust(top=0.88, bottom=0.11, left=0.065, right=0.893, hspace=0.497, wspace=0.243)
    canvas_radiance.set_text(text=f"{get_database_path(args, time_value=time_value)}")
    canvas_radiance.fig.suptitle(get_title(args, "Spectrum (Radiance) from spectrometer_visible", time_value))
    canvas_radiance.get_current_fig_manager().set_window_title(os.path.basename(__file__) + "-radiance")

    if args.save:
        fname = get_file_name(args, os.path.basename(__file__) + "-radiance", time_value)
        if args.directory:
            if not os.path.exists(args.directory):
                os.makedirs(args.directory)
            fname = os.path.join(args.directory, fname)
        canvas_radiance.save(fname)
    else:
        canvas_radiance.show(block=False)
    canvas_intensity = PlotCanvas(rows, columns)
    canvas_intensity.update_style(args.rc)
    row_counter = 0
    column_counter = 0
    for spectro_index in spectrometers_list:
        ax = canvas_intensity.add_axes(title="", xlabel="", row=row_counter, col=column_counter, colspan=1)
        column_counter = column_counter + 1
        if column_counter == 3:
            column_counter = 0
            row_counter = row_counter + 1
        intensity_file_name = sv_view.view_intensity(ax, spectro_index, logscale=args.logscale)
        if column_counter != 0:
            ax.get_legend().remove()

    canvas_intensity.set_text(text=f"{get_database_path(args, time_value=time_value)}")
    canvas_intensity.fig.suptitle(get_title(args, "Spectrum (Intensity) from spectrometer_visible", time_value))
    canvas_intensity.fig.subplots_adjust(top=0.88, bottom=0.113, left=0.033, right=0.891, hspace=0.497, wspace=0.18)
    canvas_intensity.get_current_fig_manager().set_window_title(os.path.basename(__file__) + "-intensity")

    if args.save:
        fname = get_file_name(args, os.path.basename(__file__) + "_intensity", time_value)
        if args.directory:
            if not os.path.exists(args.directory):
                os.makedirs(args.directory)
            fname = os.path.join(args.directory, fname)
        canvas_intensity.save(fname)
    else:
        canvas_intensity.show(block=True)
    connection.close()
