import json
import requests
import os

# --- KONFIGURACJA ---
BASE_PATH = "/var/lib/pterodactyl/volumes/cc7ccc03-03bd-4bde-8488-3057d3803420/squaremap/web"
RAILS_FILE = f"{BASE_PATH}/rails.json"
STATIONS_FILE = f"{BASE_PATH}/stations.json" # Plik wejściowy (zły)
OUTPUT_FILE = f"{BASE_PATH}/final_map_data.json" # Plik wyjściowy (naprawiony)

API_ROUTES_URL = "https://mtr.ciapongi.twojstarypijany.pl/mtr/api/map/stations-and-routes"

def normalize_name(name):
    """Usuwa formatowanie, białe znaki itp. dla łatwiejszego porównania"""
    return name.strip().lower()

def main():
    print("--- Start Naprawy ID (Synchronizacja z API) ---")
    
    # 1. Pobierz oficjalne dane z API (True Source of Truth)
    print(f"[*] Pobieranie danych z API MTR...")
    try:
        # verify=False dla self-signed certyfikatów
        resp = requests.get(API_ROUTES_URL, verify=False, timeout=10)
        api_data = resp.json()
        
        # Struktura API: data -> routes -> [...]
        api_root = api_data.get('data', api_data)
        real_routes = api_root.get('routes', [])
        
        print(f"[*] API zwróciło {len(real_routes)} tras.")
        
        # Tworzymy słownik: { "nazwa_trasy": "PRAWDZIWE_ID_HEX" }
        name_to_id = {}
        for r in real_routes:
            name = r.get('name', '')
            rid = r.get('id')
            # MTR używa formatu "Numer||Nazwa" lub podobnych. 
            # Kluczem będzie pełna nazwa z API.
            name_to_id[normalize_name(name)] = rid
            
    except Exception as e:
        print(f"[!] Błąd pobierania API: {e}")
        return

    # 2. Wczytaj lokalny plik mapy (ten wygenerowany przez Squaremap)
    print(f"[*] Wczytywanie pliku mapy...")
    try:
        with open(STATIONS_FILE, 'r') as f:
            local_data = json.load(f)
    except Exception as e:
        print(f"[!] Błąd odczytu stations.json: {e}")
        return

    # 3. Podmień ID w lokalnych danych
    matched_count = 0
    total_local_routes = len(local_data.get('routes', []))
    
    if 'routes' in local_data:
        for route in local_data['routes']:
            local_name = route.get('name', '')
            norm_name = normalize_name(local_name)
            
            # Próba dopasowania
            if norm_name in name_to_id:
                real_id = name_to_id[norm_name]
                # PODMIANA ID!
                route['id'] = real_id 
                matched_count += 1
            else:
                # Fallback: Spróbujmy dopasować część nazwy (np. "Ex1" vs "Ex1||Warszawa")
                found = False
                for api_name, api_id in name_to_id.items():
                    if norm_name in api_name or api_name in norm_name:
                        route['id'] = api_id
                        found = True
                        matched_count += 1
                        break
                
                if not found:
                    print(f"  [?] Nie znaleziono ID dla trasy: '{local_name}'")

    print(f"[*] Dopasowano {matched_count} z {total_local_routes} tras.")

    # 4. Zapisz naprawiony plik
    # Przy okazji kopiujemy stacje
    final_output = {
        "stations": local_data.get('stations', []),
        "routes": local_data.get('routes', [])
    }
    
    # Dodajemy geometrię (jeśli masz rails.json, można tu połączyć logikę z v4,
    # ale na razie skupmy się na ID. Jeśli v4 działało, ten skrypt można połączyć).
    # UWAGA: Ten skrypt nadpisuje final_map_data.json, więc stracisz "krzywe tory" z v4.
    # Żeby mieć jedno i drugie, musisz najpierw wygenerować v4, a potem uruchomić ten skrypt na WYNIKU v4.
    
    # Modyfikacja: Wczytajmy final_map_data.json (jeśli istnieje) zamiast stations.json,
    # żeby zachować wygenerowane tory.
    
    target_file_to_patch = OUTPUT_FILE if os.path.exists(OUTPUT_FILE) else STATIONS_FILE
    
    print(f"[*] Aktualizuję plik: {target_file_to_patch}")
    with open(target_file_to_patch, 'r') as f:
        data_to_patch = json.load(f)
        
    # Patchowanie tras w docelowym pliku
    for route in data_to_patch.get('routes', []):
        norm_name = normalize_name(route.get('name', ''))
        # Szukamy w naszym słowniku z API
        # Proste szukanie
        if norm_name in name_to_id:
            route['id'] = name_to_id[norm_name]
        else:
             # Fallback
            for api_name, api_id in name_to_id.items():
                if norm_name in api_name or api_name in norm_name:
                    route['id'] = api_id
                    break

    with open(OUTPUT_FILE, 'w') as f:
        json.dump(data_to_patch, f)
        
    print("SUKCES! ID zostały zsynchronizowane.")

if __name__ == "__main__":
    # Wyłącz ostrzeżenia SSL
    import urllib3
    urllib3.disable_warnings()
    main()
