import os, json, re

base = r"c:\Users\SarinoAlfonsoGrande\Downloads\qgis_ledger-main"

def patch(filepath, replacements):
    full_path = os.path.join(base, filepath)
    if not os.path.exists(full_path):
        print(f"  ERROR: File not found: {filepath}")
        return
    with open(full_path, "r", encoding="utf-8") as f:
        c = f.read()
    for old, new in replacements:
        if old in c:
            c = c.replace(old, new)
            print(f"  OK: {filepath}")
        else:
            # Try to match with different line endings or slight variations if needed
            print(f"  SKIP: {filepath}")
    with open(full_path, "w", encoding="utf-8") as f:
        f.write(c)

# ======================== ledger_browser.py ========================
print("=== ledger_browser.py ===")
patch("ledger_browser.py", [
    ("from qgis.PyQt.QtGui import QIcon",
     "from qgis.PyQt.QtGui import QIcon\nfrom .ledger_i18n import tr"),
    ('"📂 Esplora Storico Locale"', 'tr("📂 Esplora Storico Locale")'),
    ('"☁️ Connessioni Cloud"', 'tr("☁️ Connessioni Cloud")'),
])

# ======================== ledger_nextcloud.py ========================
print("=== ledger_nextcloud.py ===")
patch("ledger_nextcloud.py", [
    ('"Progetto Cloud"', 'tr("Progetto Cloud")'),
    ('"Workspace Cloud Sincronizzato"', 'tr("Workspace Cloud Sincronizzato")'),
    ('"Seleziona file da caricare su Nextcloud"', 'tr("Seleziona file da caricare su Nextcloud")'),
    ('"Salva file scaricato"', 'tr("Salva file scaricato")'),
    ('f"✅ Pronto."', 'tr("✅ Pronto.")'),
])

# ======================== ledger_timeline.py ========================
print("=== ledger_timeline.py ===")
patch("ledger_timeline.py", [
    ('f"Livello: {layer.name()}"', 'tr("Livello: {}").format(layer.name())'),
    ('"Screenshot non disponibile per questo commit."',
     'tr("Screenshot non disponibile per questo commit.")'),
])

# ======================== ledger_plugin.py ========================
print("=== ledger_plugin.py ===")
# Note: Using escape sequences for emojis to avoid terminal encoding issues in the script itself if possible, 
# though Python handles them fine in source if it's UTF-8.
patch("ledger_plugin.py", [
    ('"QGIS Ledger \u2014 Commit Salvato \u2705"', 'tr("QGIS Ledger \u2014 Commit Salvato \u2705")'),
    ('"QGIS Ledger \u2014 Commit Progetto \u2705"', 'tr("QGIS Ledger \u2014 Commit Progetto \u2705")'),
    ('"Estrai Progetto Self-Contained in GeoPackage"', 'tr("Estrai Progetto Self-Contained in GeoPackage")'),
    ('"\u2139\ufe0f Info Plugin"', 'tr("\u2139\ufe0f Info Plugin")'),
    ('"🔔 Notifiche mod_user"', 'tr("🔔 Notifiche mod_user")'),
    ('"⚠️ Database chiuso. Apri/salva il progetto per vedere l\'attività."',
     'tr("⚠️ Database chiuso. Apri/salva il progetto per vedere l\'attività.")'),
    ('"📂 Apri Cartella Screenshot"', 'tr("📂 Apri Cartella Screenshot")'),
    ('["Data", "Utente", "Postazione", "Layer modified"]',
     '[tr("Data"), tr("Utente"), tr("Postazione"), tr("Layer modified")]'),
    ('"Sconosciuto"', 'tr("Sconosciuto")'),
    ('"⬇️ Estrai File / Salva con nome..."', 'tr("⬇️ Estrai File / Salva con nome...")'),
    ('"🗺️ Carica in QGIS come Layer isolato"', 'tr("🗺️ Carica in QGIS come Layer isolato")'),
    ('"Chiudi"', 'tr("Chiudi")'),
    ('["ID", "Tipo", "Nome", "Data", "Utente", "Path Originale"]',
     '[tr("ID"), tr("Tipo"), tr("Nome"), tr("Data"), tr("Utente"), tr("Path Originale")]'),
    ('"File raster storicizzato non trovato."', 'tr("File raster storicizzato non trovato.")'),
    ('"Estrai Raster"', 'tr("Estrai Raster")'),
    ('"QGIS Ledger \u2014 Estrazione Raster \u2705"', 'tr("QGIS Ledger \u2014 Estrazione Raster \u2705")'),
    ('"Impossibile caricare snapshot."', 'tr("Impossibile caricare snapshot.")'),
    ('"Estrai Vettore come GeoPackage"', 'tr("Estrai Vettore come GeoPackage")'),
    ('"QGIS Ledger \u2014 Estrazione Vettore \u2705"', 'tr("QGIS Ledger \u2014 Estrazione Vettore \u2705")'),
    ('"Impossibile caricare un intero Progetto come singolo Layer. Usa la funzione Estrai."',
     'tr("Impossibile caricare un intero Progetto come singolo Layer. Usa la funzione Estrai.")'),
    ('"QGIS Ledger \u2014 Raster Caricato \u2705"', 'tr("QGIS Ledger \u2014 Raster Caricato \u2705")'),
    ('"QGIS Ledger \u2014 Vettore Caricato \u2705"', 'tr("QGIS Ledger \u2014 Vettore Caricato \u2705")'),
    ('"QGIS Ledger \u2014 Ripristino dal DB \u2705"', 'tr("QGIS Ledger \u2014 Ripristino dal DB \u2705")'),
    ('"Errore nella ricostruzione del layer dal database."', 'tr("Errore nella ricostruzione del layer dal database.")'),
    ('"QGIS Ledger \u2014 Sostituzione Completata \u2705"', 'tr("QGIS Ledger \u2014 Sostituzione Completata \u2705")'),
    ('"Errore durante rollback."', 'tr("Errore durante rollback.")'),
    ('"Layer non trovato nel progetto attuale."', 'tr("Layer non trovato nel progetto attuale.")'),
    ('"Sorgente non trovata e snapshot DB vuoto."', 'tr("Sorgente non trovata e snapshot DB vuoto.")'),
    ('"QGIS Project (*.qgz *.qgs *.gpkg);;Tutti i file (*)"',
     'tr("QGIS Project (*.qgz *.qgs *.gpkg);;Tutti i file (*)")'),
    ('"Inserisci il percorso remoto in Nextcloud (creerà la cartella se non esiste):"', 'tr("Inserisci il percorso remoto in Nextcloud (creerà la cartella se non esiste):")'),
    ('"Descrivi le modifiche (Perché):"', 'tr("Descrivi le modifiche (Perché):")'),
    ('"Sincronizza subito su Cloud"', 'tr("Sincronizza subito su Cloud")'),
    ('"Stato Ledger"', 'tr("Stato Ledger")'),
    ('"QGIS Ledger: Nessun progetto aperto"', 'tr("QGIS Ledger: Nessun progetto aperto")'),
])

# Handling multi-line strings or tricky f-strings
fp = os.path.join(base, "ledger_plugin.py")
with open(fp, "r", encoding="utf-8") as f:
    c = f.read()

# 1. Commit saved message
old_commit_msg = '''f"Commit #{commit_id} salvato con successo!\\n"
                f"Layer: {layer.name()}\\n"
                f"Features/File: {feat_count}\\n"
                f"Utente: {user}"
                f"{warn_text}\\n\\n"
                f"\U0001f4a1 Ricorda: salva il progetto QGIS (Ctrl+S) per consolidare le modifiche."'''
new_commit_msg = '''tr("Commit #{} salvato con successo!\\nLayer: {}\\nFeatures/File: {}\\nUtente: {}{}\\n\\n\U0001f4a1 Ricorda: salva il progetto QGIS (Ctrl+S) per consolidare le modifiche.").format(commit_id, layer.name(), feat_count, user, warn_text)'''
if old_commit_msg in c:
    c = c.replace(old_commit_msg, new_commit_msg)
    print("  OK: ledger_plugin.py: commit saved msg")

# 2. Commit Project message
# Normalizing whitespace for matching
old_proj_msg = '''f"Commit Progetto #{commit_id} salvato con successo!\\n"
                    f"L'intero progetto .qgz è stato archiviato nello storico.\\n"
                    f"Utente: {user}\\n\\n"
                    f"\U0001f4a1 Ricorda: salva il progetto QGIS (Ctrl+S) per consolidare le modifiche."'''
new_proj_msg = '''tr("Commit Progetto #{} salvato con successo!\\nL'intero progetto .qgz è stato archiviato nello storico.\\nUtente: {}\\n\\n\U0001f4a1 Ricorda: salva il progetto QGIS (Ctrl+S) per consolidare le modifiche.").format(commit_id, user)'''
if old_proj_msg in c:
    c = c.replace(old_proj_msg, new_proj_msg)
    print("  OK: ledger_plugin.py: commit proj msg")

# 3. External sync changes
old_sync_msg = '''"Modifiche esterne rilevate nel database.\\n"
                "La timeline è stata aggiornata."'''
new_sync_msg = '''tr("Modifiche esterne rilevate nel database.\\nLa timeline è stata aggiornata.")'''
if old_sync_msg in c:
    c = c.replace(old_sync_msg, new_sync_msg)
    print("  OK: ledger_plugin.py: sync msg")

# 4. Notifications f-strings
old_news = """f"Ottime notizie! {len(new_commits_by_others)} nuove modifiche aggiunte dai mod_user ({', '.join(mod_users)}).\""""
new_news = """tr("Ottime notizie! {} nuove modifiche aggiunte dai mod_user ({}).").format(len(new_commits_by_others), ', '.join(mod_users))"""
c = c.replace(old_news, new_news)

old_found = """f"Sono state trovate {len(new_commits_by_others)} nuove modifiche apportate dai mod_user:\\n\""""
new_found = """tr("Sono state trovate {} nuove modifiche apportate dai mod_user:\\n").format(len(new_commits_by_others))"""
c = c.replace(old_found, new_news)

with open(fp, "w", encoding="utf-8") as f:
    f.write(c)

# ======================== en.json ========================
print("=== en.json ===")
en_path = os.path.join(base, "i18n", "en.json")
if os.path.exists(en_path):
    with open(en_path, "r", encoding="utf-8") as f:
        en = json.load(f)
else:
    en = {}

new_translations = {
    "📂 Esplora Storico Locale": "📂 Browse Local History",
    "☁️ Connessioni Cloud": "☁️ Cloud Connections",
    "Progetto Cloud": "Cloud Project",
    "Workspace Cloud Sincronizzato": "Cloud Workspace Synchronized",
    "Seleziona file da caricare su Nextcloud": "Select files to upload to Nextcloud",
    "Salva file scaricato": "Save downloaded file",
    "✅ Pronto.": "✅ Ready.",
    "Livello: {}": "Layer: {}",
    "Screenshot non disponibile per questo commit.": "Screenshot not available for this commit.",
    "QGIS Ledger \u2014 Commit Salvato \u2705": "QGIS Ledger \u2014 Commit Saved \u2705",
    "Commit #{} salvato con successo!\nLayer: {}\nFeatures/File: {}\nUtente: {}{}\n\n\U0001f4a1 Ricorda: salva il progetto QGIS (Ctrl+S) per consolidare le modifiche.": "Commit #{} saved successfully!\nLayer: {}\nFeatures/File: {}\nUser: {}{}\n\n\U0001f4a1 Remember: save the QGIS project (Ctrl+S) to consolidate the changes.",
    "QGIS Ledger \u2014 Commit Progetto \u2705": "QGIS Ledger \u2014 Project Commit \u2705",
    "Commit Progetto #{} salvato con successo!\nL'intero progetto .qgz è stato archiviato nello storico.\nUtente: {}\n\n\U0001f4a1 Ricorda: salva il progetto QGIS (Ctrl+S) per consolidare le modifiche.": "Project Commit #{} saved successfully!\nThe entire .qgz project has been archived in history.\nUser: {}\n\n\U0001f4a1 Remember: save the QGIS project (Ctrl+S) to consolidate the changes.",
    "Estrai Progetto Self-Contained in GeoPackage": "Extract Self-Contained Project to GeoPackage",
    "\u2139\ufe0f Info Plugin": "\u2139\ufe0f Plugin Info",
    "🔔 Notifiche mod_user": "🔔 User Notifications",
    "⚠️ Database chiuso. Apri/salva il progetto per vedere l'attività.": "⚠️ Database closed. Open/save the project to see activity.",
    "📂 Apri Cartella Screenshot": "📂 Open Screenshot Folder",
    "Data": "Date",
    "Utente": "User",
    "Postazione": "Workstation",
    "Layer modified": "Layer modified",
    "Sconosciuto": "Unknown",
    "⬇️ Estrai File / Salva con nome...": "⬇️ Extract File / Save As...",
    "🗺️ Carica in QGIS come Layer isolato": "🗺️ Load in QGIS as isolated Layer",
    "Chiudi": "Close",
    "ID": "ID",
    "Tipo": "Type",
    "Nome": "Name",
    "Path Originale": "Original Path",
    "File raster storicizzato non trovato.": "Archived raster file not found.",
    "Estrai Raster": "Extract Raster",
    "QGIS Ledger \u2014 Estrazione Raster \u2705": "QGIS Ledger \u2014 Raster Extraction \u2705",
    "Impossibile caricare snapshot.": "Unable to load snapshot.",
    "Estrai Vettore come GeoPackage": "Extract Vector as GeoPackage",
    "QGIS Ledger \u2014 Estrazione Vettore \u2705": "QGIS Ledger \u2014 Vector Extraction \u2705",
    "Impossibile caricare un intero Progetto come singolo Layer. Usa la funzione Estrai.": "Cannot load an entire Project as a single Layer. Use the Extract function.",
    "QGIS Ledger \u2014 Raster Caricato \u2705": "QGIS Ledger \u2014 Raster Loaded \u2705",
    "QGIS Ledger \u2014 Vettore Caricato \u2705": "QGIS Ledger \u2014 Vector Loaded \u2705",
    "QGIS Ledger \u2014 Ripristino dal DB \u2705": "QGIS Ledger \u2014 Restored from DB \u2705",
    "Errore nella ricostruzione del layer dal database.": "Error reconstructing the layer from the database.",
    "QGIS Ledger \u2014 Sostituzione Completata \u2705": "QGIS Ledger \u2014 Replacement Completed \u2705",
    "Errore durante rollback.": "Error during rollback.",
    "Layer non trovato nel progetto attuale.": "Layer not found in the current project.",
    "Sorgente non trovata e snapshot DB vuoto.": "Source not found and DB snapshot is empty.",
    "QGIS Project (*.qgz *.qgs *.gpkg);;Tutti i file (*)": "QGIS Project (*.qgz *.qgs *.gpkg);;All files (*)",
    "Modifiche esterne rilevate nel database.\nLa timeline è stata aggiornata.": "External changes detected in the database.\nThe timeline has been updated.",
    "Inserisci il percorso remoto in Nextcloud (creerà la cartella se non esiste):": "Enter remote path in Nextcloud (will create folder if doesn't exist):",
    "Descrivi le modifiche (Perché):": "Describe changes (Why):",
    "Sincronizza subito su Cloud": "Sync to Cloud now",
    "Stato Ledger": "Ledger Status",
}

en.update(new_translations)
with open(en_path, "w", encoding="utf-8") as f:
    json.dump(en, f, indent=4, ensure_ascii=False)

print("DONE - All files patched.")
