from rich.console import Console
from rich.table import Table
import astropy.units as u


def printSNR(exp_time: u.Quantity, snr: u.Quantity):
    """
    Print the results of the SNR calculation.

    Parameters
    ----------
    exp_time : Quantity
        The exposure times for which the SNR was calculated.
    snr : Quantity
        The corresponding SNR for the exposure times.

    Returns
    -------

    """
    table = Table(show_header=True, header_style="bold magenta")
    table.add_column("#", style="dim", width=4, justify="center")
    table.add_column("Exposure Time", justify="right")
    table.add_column("SNR", justify="right")
    if exp_time.size > 1:
        for i, exp_time_, snr_ in zip(range(len(exp_time)), exp_time.value, snr.value):
            table.add_row(str(i), ("%1.4e " + exp_time.unit.to_string()) % exp_time_, "%1.4e" % snr_)
    else:
        table.add_row("1", ("%1.4e " + exp_time.unit.to_string()) % exp_time.value, "%1.4e" % snr.value)
    console = Console()
    console.print("")
    console.print(table)


def printExposureTime(exp_time: u.Quantity, snr: u.Quantity):
    """
    Print the results of the exposure time calculation.

    Parameters
    ----------
    exp_time : Quantity
        The corresponding exposure time for the SNRs.
    snr : Quantity
        The SNRs for which the exposure time was calculated.

    Returns
    -------

    """
    table = Table(show_header=True, header_style="bold magenta")
    table.add_column("#", style="dim", width=4, justify="center")
    table.add_column("SNR", justify="right")
    table.add_column("Exposure Time", justify="right")
    if exp_time.size > 1:
        for i, exp_time_, snr_ in zip(range(len(exp_time)), exp_time.value, snr.value):
            table.add_row(str(i), "%1.4e" % snr_, ("%1.4e " + exp_time.unit.to_string()) % exp_time_)
    else:
        table.add_row("1", "%1.4e" % snr.value, ("%1.4e " + exp_time.unit.to_string()) % exp_time.value)
    console = Console()
    console.print("")
    console.print(table)


def printSensitivity(exp_time: u.Quantity, snr: u.Quantity, sensitivity: u.Quantity):
    """
    Print the results of the sensitivity calculation.

    Parameters
    ----------
    exp_time : Quantity
        The exposure times for which the sensitivity was calculated.
    snr : Quantity
        The SNRs for which the sensitivity was calculated.
    sensitivity : Quantity
        The corresponding sensitivity for the exposure times and SNRs.

    Returns
    -------

    """
    table = Table(show_header=True, header_style="bold magenta")
    table.add_column("#", style="dim", width=4, justify="center")
    table.add_column("Exposure Time", justify="right")
    table.add_column("SNR", justify="right")
    table.add_column("Sensitivity", justify="right")
    if exp_time.size > 1:
        for i, exp_time_, snr_, sensitivity_ in zip(range(len(exp_time)), exp_time.value, snr.value, sensitivity.value):
            table.add_row(str(i), ("%1.4e " + exp_time.unit.to_string()) % exp_time_, "%1.4e" % snr_,
                          ("%1.4e " + sensitivity.unit.to_string()) % sensitivity_)
    else:
        table.add_row("1", ("%1.4e " + exp_time.unit.to_string()) % exp_time.value, "%1.4e" % snr.value,
                      ("%1.4e " + sensitivity.unit.to_string()) % sensitivity.value)
    console = Console()
    console.print("")
    console.print(table)