import os
import time

import pandas as pd
import requests

f_dir = os.path.dirname(__file__)
# --- Configuration ---
BASE_URL = "http://127.0.0.1:5000/api"
ENDPOINTS = {
    "sensor": f"{BASE_URL}/add-sensor-data",
    "vibration": f"{BASE_URL}/add-vibration-data",
    "silo": f"{BASE_URL}/add-silo-data",
}

# --- Configuration ---
BASE_URL = "http://127.0.0.1:5000/api"
ENDPOINTS = {
    "sensor": f"{BASE_URL}/add-sensor-data",
    "vibration": f"{BASE_URL}/add-vibration-data",
    "silo": f"{BASE_URL}/add-silo-data",
}

# --- Column Mapping: Excel Name -> Model Attribute Name ---
SENSOR_MAP = {
    "hat": "hat_id",
    "is_emri": "is_emri",
    "HataOranı": "hata_orani",
    "AnamotorHızı": "ana_motor_hizi",
    "AnaMotorAkımı": "ana_motor_akimi",
    "ÇizgiMotorHızı": "cizgi_motor_hizi",
    "Çizgi motor akımı": "cizgi_motor_akimi",
    "ÇekiciHızı": "cekici_hizi",
    "EriyikBasıncı": "eriyik_basinci",
    "Vakum Tankı1": "vakum_tanki1",
}
# Adding tc and sicaklik dynamically to SENSOR_MAP
for i in range(1, 25):
    SENSOR_MAP[f"tc{i}"] = f"tc{i}"
for i in range(1, 29):
    SENSOR_MAP[f"Sıcaklık{i}"] = f"sicaklik{i}"

VIBE_MAP = {
    "hat": "hat_id",
    "is_emri": "is_emri",
    "v-RMS(x)": "v_rms_x",
    "v-RMS(y)": "v_rms_y",
    "v-RMS(z)": "v_rms_z",
    "v-RMS(Magnitude)": "v_rms_magnitude",
    "Scale/v-RMS]": "scale_v_rms",
    "a-Peak(x)": "a_peak_x",
    "a-Peak(y)": "a_peak_y",
    "a-Peak(z)": "a_peak_z",
    "a-Peak(Magnitude)": "a_peak_magnitude",
    "a-RMS(x)": "a_rms_x",
    "a-RMS(y)": "a_rms_y",
    "a-RMS(z)": "a_rms_z",
    "a-RMS(Magnitude)": "a_rms_magnitude",
    "olcekleme/ a-Peak/v-RMS": "olcekleme_a_peak_v_rms",
    "Sicaklik": "sicaklik",
    "Olcekleme/Sicaklik": "olcekleme_sicaklik",
    "Cihaz Durumu": "cihaz_durumu",
}

SILO_MAP = {
    "hat": "hat_id",
    "is_emri": "is_emri",
    "Silo1": "silo1",
    "Silo2": "silo2",
    "Silo3": "silo3",
    "Proses Su Giriş": "proses_su_giris",
    "ProsesSuÇıkış": "proses_su_cikis",
    "İç Ortam Isısı": "ic_ortam_isisi",
    "HavaTankBasıncı": "hava_tank_basinci",
    "Su Seviyesi": "su_seviyesi",
    "Su Basıncı": "su_basinci",
    "Chiller1": "chiller1",
    "Chiller2": "chiller2",
}
for i in range(1, 9):
    SILO_MAP[f"Pompa{i}"] = f"pompa{i}"


def rename_payload(row_dict, mapping):
    """Converts Excel keys to Model keys based on the mapping."""
    return {mapping.get(k, k): v for k, v in row_dict.items() if k in mapping}


def stream_data():
    # Load files and handle NaN
    df_sensor = pd.read_excel(os.path.join(f_dir, "DATA", "sensor.xlsx")).fillna(0)
    df_vibe = pd.read_excel(os.path.join(f_dir, "DATA", "titresim.xlsx")).fillna(0)
    df_silo = pd.read_excel(os.path.join(f_dir, "DATA", "silo.xlsx")).fillna(0)

    min_rows = min(len(df_sensor), len(df_vibe), len(df_silo))

    for i in range(min_rows):
        start_time = time.time()

        # Extract and rename
        payloads = {
            "sensor": rename_payload(df_sensor.iloc[i].to_dict(), SENSOR_MAP),
            "vibration": rename_payload(df_vibe.iloc[i].to_dict(), VIBE_MAP),
            "silo": rename_payload(df_silo.iloc[i].to_dict(), SILO_MAP),
        }

        # Send requests
        for key, data in payloads.items():
            try:
                res = requests.post(ENDPOINTS[key], json=data)
                status = "Success" if res.status_code == 201 else f"Failed: {res.text}"
                print(f"Row {i} | {key:10} | {status}")
            except Exception as e:
                print(f"Row {i} | {key:10} | Connection Error\n{e}")

        # Sync to 10 seconds
        elapsed = time.time() - start_time
        time.sleep(max(0, 1 - elapsed))


if __name__ == "__main__":
    stream_data()
