import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Schriftart auf "Charter" setzen
plt.rcParams['font.family'] = 'Charter'
plt.rcParams['axes.titlesize'] = 30
plt.rcParams['axes.labelsize'] = 30
plt.rcParams['xtick.labelsize'] = 30
plt.rcParams['ytick.labelsize'] = 30
plt.rcParams['legend.fontsize'] = 30


# Ordnernahme bitte individuell anpassen
#folder_name = fr"Referenzversuch_V1_gekürzt"
#folder_name = fr"Achsversatz_X050_V1_gekürzt"
#folder_name = fr"Achsversatz_X100_V1_gekürzt"
#folder_name = fr"Achsversatz_Y050_V1_gekürzt"
#folder_name = fr"Achsversatz_Y100_V1_gekürzt"
#folder_name = fr"Achsversatz_Z050_V1_gekürzt"
#folder_name = fr"Achsversatz_Z100_V1_gekürzt"
#folder_name = fr"Winkelversatz_2_V1_gekürzt"
folder_name = fr"Winkelversatz_4_V1_gekürzt"


input_folder = fr"C:\Users\simon\Desktop\Uni\Master\Master_Thesis\Versuchsdaten\Versuchsauswertung\extracted_data_for_single_drilling\{folder_name}"

def calculate_means_for_points(data, window=2000):
    """
    Berechnet die Mittelwerte der Totalforce für die Punkte 1 bis 9 basierend auf der Annotationsspalte.
    """
    means = {}

    if 'Total Force (N)' not in data.columns:
        raise KeyError("Die Spalte 'Total Force (N)' fehlt in den Daten.")

    annotation_indices = data.index[data['Annotations'] > 0].tolist()
    annotation_values = data.loc[annotation_indices, 'Annotations']

    for i, index in enumerate(annotation_indices):
        point = annotation_values.iloc[i]

        if point == 1:
            start = index
            end = index + window
            mean_part1 = data['Total Force (N)'].iloc[start:end].mean()


            # das hier Term um ende also punkt 9 zu 1 hinzuzufügen
            # start_9 = annotation_indices[-1] - window
            # end_9 = annotation_indices[-1]
            # mean_part2 = data['Total Force (N)'].iloc[start_9:end_9].mean()
            # means[f"{int(point)}"] = (mean_part1 + mean_part2) / 2

            means[f"{int(point)}"] = mean_part1  # nur rechter Term an Punkt 1


        elif point == 9:
            continue

        else:
            start = max(0, index - window)
            end = min(len(data), index + window)
            means[f"{int(point)}"] = data['Total Force (N)'].iloc[start:end].mean()

    return means


def process_all_csv_files_and_plot(folder_path, excel_file, output_csv, output_svg):
    """
    Verarbeitet CSV-Dateien, berechnet Mittelwerte, kombiniert sie mit Daten aus Excel und speichert Ergebnisse.
    """
    csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
    all_means = []

    # Lesen der Excel-Daten
    excel_data = pd.read_excel(excel_file)
    bohrungen = excel_data['Bohrung']  # Namen der Bohrungen
    positions = [str(i) for i in range(1, 9)]  # Messpositionen als Zahlen (1 bis 8)
    numerical_data = excel_data.iloc[:, 1:]  # Numerische Werte (Fasenbreiten)

    # Plot-Setup für beide Plots nebeneinander
    fig, axes = plt.subplots(len(csv_files), 2, figsize=(16, 5 * len(csv_files)), constrained_layout=True)

    if len(csv_files) == 1:
        axes = [axes]  # Ensure axes is a list for single file case

    for row_idx, csv_file in enumerate(csv_files):
        input_path = os.path.join(folder_path, csv_file)
        data = pd.read_csv(input_path)
        means = calculate_means_for_points(data)

        # Ändere den Namen der Datei zu Bohrung_1, Bohrung_2 usw.
        bohrung_name = f"Bohrung_{row_idx + 1}"
        all_means.append({"File": bohrung_name, **means})

        # Total Force Plot (links)
        x_force = list(range(1, 9))  # Stelle sicher, dass die x-Werte 1–8 sind
        y_force = [means.get(str(i), 0) for i in x_force]  # Sichere Zuordnung zu Position 1–8
        axes[row_idx, 0].bar(x_force, y_force, color='skyblue', width=0.8)
        axes[row_idx, 0].set_title(f"{bohrung_name}")
        axes[row_idx, 0].set_ylabel("Gesamtkraft (N)")
        axes[row_idx, 0].set_xticks(x_force)  # X-Ticks genau unter die Säulen setzen
        axes[row_idx, 0].set_xticklabels(x_force)  # Beschriftung der X-Ticks
        axes[row_idx, 0].grid(True)
        axes[row_idx, 0].set_xlabel("Messpositionen")

        # Fasenbreite Plot (rechts)
        axes[row_idx, 1].plot(x_force, numerical_data.iloc[row_idx], marker='o')
        axes[row_idx, 1].set_title(bohrungen[row_idx])
        axes[row_idx, 1].set_ylabel('Fasenbreite (μm)')
        axes[row_idx, 1].set_xticks(x_force)  # X-Ticks auf 1–8 setzen
        axes[row_idx, 1].set_xticklabels(x_force)  # Labels explizit setzen
        axes[row_idx, 1].set_ylim(0, numerical_data.max().max() * 1.1)  # Dynamischer Max-Wert mit 10% Puffer
        axes[row_idx, 1].grid(True)
        axes[row_idx, 1].set_xlabel("Messpositionen")

    # Speichern der Mittelwerte in einer CSV-Datei
    results_df = pd.DataFrame(all_means)
    results_df.to_csv(output_csv, index=False)
    print(f"Mittelwerte gespeichert in: {output_csv}")

    # Speichern der kombinierten Plots als SVG
    plt.savefig(output_svg, format='svg')
    print(f"Kombinierter Plot gespeichert in: {output_svg}")
    plt.close()


# Entferne "_gekürzt" aus dem Namen für die Excel-Datei
excel_file_name = folder_name.replace("_gekürzt", "")

# Pfade für Input und Output
folder_path = fr"{input_folder}\final"  # Ordner mit CSV-Dateien
excel_file = fr"{input_folder}\{excel_file_name}.xlsx"  # Excel-Datei
output_csv = fr"{input_folder}\Mittelwerte.csv"  # Ziel für die Mittelwerte
output_svg = fr"{input_folder}\combined_plot.svg"  # Ziel für den kombinierten Plot

process_all_csv_files_and_plot(folder_path, excel_file, output_csv, output_svg)
