#!/usr/bin/env python3

from copy import deepcopy
from warnings import filterwarnings
from gettext import install
from logging import basicConfig, getLogger
from pathlib import Path

from rich.logging import RichHandler
from matplotlib.pyplot import figure

from backscattering_analyzer import Experiment, AcquisitionType, Sneb, Sweb, Sdb1, Sdb2  # pyright: ignore[reportMissingTypeStubs, reportUnusedImport]
from backscattering_analyzer.bench import Bench  # pyright: ignore[reportMissingTypeStubs]
from backscattering_analyzer.utils import fit_projection  # pyright: ignore[reportMissingTypeStubs]

install(__name__)
filterwarnings("error")

basicConfig(
    level="INFO",
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler()],
)
logger = getLogger(__name__)

sdb2: Bench = Sdb2()

excited: Experiment = Experiment(
    "2024_10_31", set([sdb2]), Path("/home/demagny/data"), AcquisitionType.EXCITED
)
excited.projection.compute()

if excited.sensitivity.data is None:
    raise Exception(_("no sensitivity"))
if excited.projection.data is None:
    raise Exception(_("no projection"))
show_sensitivity = excited.sensitivity.data.psd().sqrt()

reference = Experiment(
    "2024_10_31",
    set([deepcopy(sdb2)]),
    Path("/home/demagny/data"),
    AcquisitionType.REFERENCE,
)

if reference.sensitivity.data is None:
    raise Exception(_("reference experiment does not have any sensitivity data"))

factors, diff = fit_projection(
    excited,
    reference,
)

excited.projection.scatter_factor = factors
excited.projection.compute()

projection = reference.sensitivity.data.psd().sqrt() + excited.projection.data

fig = figure(figsize=(20, 10))
fig.gca().loglog(show_sensitivity.x, show_sensitivity.y, label=_("excited sensitivity"))
fig.gca().loglog(
    projection.x, projection.y, label=_("projection + reference sensitivity")
)
fig.gca().legend()
fig.gca().grid(True, "both")
fig.gca().set_xlim(5, 100)
fig.gca().set_ylim(10e-28, 10e-18)
fig.gca().set_title(_("SDB2"))
fig.gca().set_xlabel(_("frequencies (Hz)"))
fig.gca().set_ylabel(_("sensitivity ($\\frac{1} {\\sqrt {Hz}}$)"))
fig.savefig("SDB2.png")
with open("SDB2.csv", "w") as f:
    f.write(
        """
    # bench	value
    SDB2	{}
    """.format(factors["SDB2"])
    )