import pandas as pd
import json
import os
import uuid
from datetime import datetime

# --- KONFIGURATION ---
EXCEL_FILE = 'hardware_import.xlsx'  # Deine Excel-Datei (muss im selben Ordner liegen)
JSON_FILE = 'db/hardware/test_equipment_data.json'  # Pfad zur echten Datenbank
BACKUP_FILE = f'db/hardware/test_equipment_data_backup_{int(datetime.now().timestamp())}.json'


def load_existing_data():
    """Lädt die bestehende JSON-Datenbank oder erstellt eine leere Struktur."""
    if os.path.exists(JSON_FILE):
        print(f"Lade existierende Datenbank: {JSON_FILE}")
        # Backup erstellen
        import shutil
        try:
            shutil.copy(JSON_FILE, BACKUP_FILE)
            print(f"Backup erstellt: {BACKUP_FILE}")
        except Exception as e:
            print(f"WARNUNG: Backup konnte nicht erstellt werden: {e}")

        with open(JSON_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    else:
        print("Keine existierende Datenbank gefunden. Erstelle neu.")
        return {
            "inventory": {}, "boms": {}, "mappings": {},
            "trolleys": {}, "storage_units": {}
        }


def process_excel():
    """Liest die Excel und konvertiert sie in die JSON-Struktur."""
    if not os.path.exists(EXCEL_FILE):
        print(f"FEHLER: Excel-Datei '{EXCEL_FILE}' nicht gefunden.")
        return

    # Excel lesen (Nimmt an, dass die Spaltennamen in Zeile 1 stehen)
    try:
        df = pd.read_excel(EXCEL_FILE, dtype=str)  # Alles als String lesen, um Formatierungsprobleme zu vermeiden
        df = df.fillna('')  # NaN durch leere Strings ersetzen
    except Exception as e:
        print(f"FEHLER beim Lesen der Excel: {e}")
        return

    data = load_existing_data()
    inventory = data.get('inventory', {})

    new_count = 0
    update_count = 0

    # Iteriere über jede Zeile der Excel
    for index, row in df.iterrows():
        pn = row.get('P/N', '').strip()
        sn = row.get('S/N', '').strip()

        if not pn or not sn:
            print(f"Zeile {index + 2} übersprungen: P/N oder S/N fehlt.")
            continue

        # Haupt-Eintrag für P/N erstellen oder holen
        if pn not in inventory:
            inventory[pn] = {
                "name": row.get('Name', '').strip(),
                "type": row.get('Hardware Type', '').strip(),
                "productType": [pt.strip() for pt in row.get('Product Type', '').split(',') if pt.strip()],
                "description": row.get('Description', '').strip(),
                "serials": []
            }
            new_count += 1
        else:
            # Optional: Stammdaten aktualisieren (wenn gewünscht)
            # inventory[pn]['name'] = row.get('Name', '').strip()
            pass

        # Serial-Eintrag prüfen
        serials_list = inventory[pn]['serials']
        existing_serial = next((s for s in serials_list if s['sn'] == sn), None)

        if existing_serial:
            # Update existierender SN (nur Location/Status/Check, ID bleibt!)
            print(f"Update: {pn} - {sn}")
            if row.get('Location'): existing_serial['location'] = row.get('Location', '').strip()
            if row.get('Status'): existing_serial['status'] = row.get('Status', '').strip()
            if row.get('Last Check'): existing_serial['lastCheck'] = row.get('Last Check', '').strip()
            update_count += 1
        else:
            # Neue SN anlegen
            print(f"Neu: {pn} - {sn}")
            new_serial_entry = {
                "id": f"hw_{uuid.uuid4().hex[:12]}",  # Automatische UUID
                "sn": sn,
                "location": row.get('Location', '').strip(),
                "status": row.get('Status', 'Available').strip(),
                "lastCheck": row.get('Last Check', '').strip(),
                "maintenanceId": "N/A",  # Standard
                "documents": [],
                "maintenanceLinks": [],
                "statusSummary": {"light": "GREEN", "nextDue": "N/A", "openIssues": 0, "issueList": []}
            }
            serials_list.append(new_serial_entry)
            new_count += 1

    # Speichern
    try:
        data['inventory'] = inventory
        os.makedirs(os.path.dirname(JSON_FILE), exist_ok=True)
        with open(JSON_FILE, 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=2, ensure_ascii=False)
        print(f"\nERFOLG: Datenbank aktualisiert.")
        print(f"Statistik: {new_count} Teile neu/aktualisiert.")
    except Exception as e:
        print(f"FEHLER beim Speichern der JSON: {e}")


if __name__ == '__main__':
    process_excel()