# %% Simulation von EMAG GT Betrieb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Pfad zur Input-CSV-Datei
input_csv = 'Simbase.csv'

# Lese die CSV-Datei
data = pd.read_csv(input_csv)

# Funktion zum Hinzufügen von farbigem Rauschen
def add_colored_noise(data, base_noise_level, color):
    noise_scale = np.random.uniform(0.1, 100)  # Zufällige Skalierung für jedes Rauschen

    if color == 'pink':
        exponent = 1.0
    elif color == 'brown':
        exponent = 2.0
    else:
        exponent = 0.0

    freqs = np.fft.fftfreq(len(data))
    spectrum = np.random.normal(scale=np.sqrt(base_noise_level * noise_scale), size=len(data))
    spectrum *= 1 / (np.abs(freqs) ** (exponent / 2.0) + 0.01)
    noise = np.real(np.fft.ifft(spectrum))

    return data + noise

def add_random_factor(data, min_factor=0.9, max_factor=1.1):
    random_factors = np.random.uniform(min_factor, max_factor, size=len(data))
    return data * random_factors

def simulate_machine_operation(data, num_starts, operation_seconds_per_start, pause_duration):
    simulated_data = pd.DataFrame()
    for _ in range(num_starts):
        # Teile die Daten in Start, Betrieb und Abschalten
        start_phase = data[data['Phase'] == 'Start'].copy()
        operation_phase = data[data['Phase'] == 'Betrieb'].copy()
        shutdown_phase = data[data['Phase'] == 'Abschalten'].copy()

        # Wiederhole den Betrieb bis zur gewünschten Dauer
        repeat_times = operation_seconds_per_start // len(operation_phase) + 1
        operation_phase = pd.concat([operation_phase] * repeat_times, ignore_index=True)
        operation_phase = operation_phase.iloc[:operation_seconds_per_start]

        # Füge für jeden Zyklus neues Rauschen hinzu
        start_phase['Leistung'] = add_colored_noise(start_phase['Leistung'], base_noise_level=0.05, color='pink')
        operation_phase['Leistung'] = add_colored_noise(operation_phase['Leistung'], base_noise_level=0.02, color='white')
        shutdown_phase['Leistung'] = add_colored_noise(shutdown_phase['Leistung'], base_noise_level=0.05, color='brown')

        # Zusammenführen von Start, Betrieb und Abschalten
        cycle_data = pd.concat([start_phase, operation_phase, shutdown_phase], ignore_index=True)

        # Pause-Phase hinzufügen
        pause_section = data.iloc[6900:6960].copy()  # Daten für die Pause
        repeat_pause_times = pause_duration // len(pause_section) + 1
        pause_section = pd.concat([pause_section] * repeat_pause_times, ignore_index=True)
        pause_section = pause_section.iloc[:pause_duration]  # Kürze die Pause auf die gewünschte Dauer

        # Hinzufügen der Pause-Phase zum Zyklus
        cycle_data = pd.concat([cycle_data, pause_section], ignore_index=True)

        # Hinzufügen des Zyklus zu den simulierten Daten
        simulated_data = pd.concat([simulated_data, cycle_data], ignore_index=True)

    return simulated_data

# Parameter für die Simulation
num_starts = 1
operation_time_hour = 0.75  # # Flexhorizont in h / Menge an teilen   1 Teil= 90 Sekunden = 0.025h
operation_seconds_per_start = int(operation_time_hour * 3600)  # Umrechnung in Sekunden
pause_duration = 5000  # Dauer der Pause in Sekunden

# Führe die Simulation aus
simulated_data = simulate_machine_operation(data, num_starts, operation_seconds_per_start, pause_duration)
simulated_power = add_random_factor(simulated_data['Leistung'])


plt.figure(figsize=(14, 7))
#plt.plot(data['Leistung'], label='Original Maschinenleistung', color='blue', alpha=0.5)
plt.plot(simulated_power, label='Simulated electric power consumption', color='red', alpha=0.7)
plt.xlabel('Time in s')
plt.ylabel('Power in Watt')
#plt.title('Original vs. Simulierte Maschinenleistung über die Zeit')
plt.legend()

plt.show()
simulated_power = simulated_data.rename(columns={'Leistung': 'Pges'})
output_csv = 'simulated_machine_data_2h_30teile.csv'
simulated_power.to_csv(''+output_csv, index=False)
