import numpy as np
import matplotlib.pyplot as plt
import Kinetics_fit as kinf
from matplotlib.offsetbox import AnchoredText
import fit_utils
import plot_utils
import data_read
import substrate_dictionaries as sdicts


def fit_data_mod(plot_data, x_values, y_values, y_std, ax, weg):
    """Funktion erstellt den Fit für die Daten mit der neuen, umgeformten Gleichung von MicherlisMenden mit Substratihibierung, indem die Funtkion calc and draw fit aufgerufen wird
    erstellt gleich einen plot mit dem Fit
    Berechnet Schlüsselbarameter für jedes Substrat"""
    popt, perr = fit_utils.calc_and_draw_fit(
        kinf.michaelismenten_subinh_mod,
        plot_data,
        x_values,
        y_values,
        y_std,
        weg,
    )
    Vmax = popt[0]
    Vmaxerr = perr[0]
    cmax = popt[1]
    cmaxerr = perr[1]
    Ki = popt[2]
    Kierr = perr[2]
    Ks = kinf.calc_Ks_mod(cmax, Ki)
    Kserr = kinf.calc_Ks_mod_err(cmax, Ki, cmaxerr, Kierr)
    Ks2 = kinf.calc_Ks2_mod(cmax, Ki)
    Ks2err = kinf.calc_Ks2_mod_err(cmax, Ki, cmaxerr, Kierr)
    textbox = AnchoredText(
        "$v_{{max}}$ = {Vmax:.3f} ± {Vmaxerr:.3f} \n"
        "$K_{{S}}$ = {Ks:.3f} ± {Kserr:.3f}\n"
        "$K_{{SI}}$ = {Ks2:.3f} ± {Ks2err:.3f}\n"
        "$K_{{I}}$ = {Ki:.3f} ± {Kierr:.3f}\n"
        "$c_{{max}}$ = {cmax:.3f} ± {cmaxerr:.3f}".format(
            Vmax=Vmax,
            Vmaxerr=Vmaxerr,
            cmax=cmax,
            cmaxerr=cmaxerr,
            Ki=Ki,
            Kierr=Kierr,
            Ks=Ks,
            Kserr=Kserr,
            Ks2=Ks2,
            Ks2err=Ks2err,
        ),
        loc="right",
    )
    ax.add_artist(textbox)


def singlesubstrate(filename, filename_fit, weg, use_ystd=False):
    """Funktion ruft über fit_data_mod den Fit der Daten auf
    erstellt gleich einen plot mit den Datenpunkten"""
    # Read data from the file using numpy
    x_values, y_values, y_std = data_read.read_data(filename_fit)
    _, ax = plt.subplots(figsize=(11.5, 8), constrained_layout=True)
    # Plot the fit. If you want to use the y_std deviation for that type ysdt=1
    if use_ystd:
        fit_data_mod(plot_utils.plot_data, x_values, y_values, y_std, ax, weg)
    else:
        fit_data_mod(plot_utils.plot_data, x_values, y_values, None, ax, weg)

    x_values, y_values, y_std = data_read.read_data(filename)
    # Plot the data average with the error bars
    plot_utils.plot_data_error_singlepoints(
        x_values,
        y_values,
        y_std,
        color=sdicts.substrateColorDictionary[filename],
        legend_label_y="data average",
        title="",
        # title=filename.split(".")[0],
        xlabel="Concentration (mM)",
        ylabel=r"Specific activity ($\text{U g}_{\text{CDW}}^{-1}$)",
    )
    plt.grid(False)
    # plt.xscale('log')
    plt.savefig(filename.split(".")[0] + "_plot.jpg", dpi=300)
    plt.show()


