#!/usr/bin/env python3
"""
Script per creare l'eseguibile standalone di Psytec Server Connector
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def create_executable():
    """Crea l'eseguibile usando PyInstaller"""
    print("🚀 Creazione eseguibile Psytec Server Connector...")
    
    # Verifica che main.py esista
    if not os.path.exists("main.py"):
        print("❌ Errore: main.py non trovato!")
        print("💡 Assicurati che main.py sia nella stessa cartella di questo script")
        return False
    
    # Comando PyInstaller
    cmd = [
        "pyinstaller",
        "--onefile",                    # Un singolo file eseguibile
        "--windowed",                   # No console (solo GUI)
        "--name=PsytecServerConnector", # Nome dell'eseguibile
        "--clean",                      # Pulisci cache precedenti
        "main.py"
    ]
    
    # Opzioni aggiuntive per ottimizzare
    additional_options = [
        "--optimize=2",                 # Ottimizzazione bytecode
        "--noupx",                      # Non usare UPX compression
    ]
    
    # Aggiungi opzioni specifiche per piattaforma
    if sys.platform == "win32":
        # Opzioni Windows
        if os.path.exists("version_info.txt"):
            cmd.append("--version-file=version_info.txt")
        if os.path.exists("icon.ico"):
            cmd.append("--icon=icon.ico")
    else:
        # Solo per Linux/Mac
        additional_options.append("--strip")
    
    cmd.extend(additional_options)
    
    print(f"📦 Comando: {' '.join(cmd)}")
    
    try:
        # Esegui PyInstaller
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print("✅ PyInstaller completato con successo!")
        
        # Verifica che l'eseguibile sia stato creato
        if sys.platform == "win32":
            exe_path = "dist/PsytecServerConnector.exe"
        else:
            exe_path = "dist/PsytecServerConnector"
            
        if os.path.exists(exe_path):
            file_size = os.path.getsize(exe_path) / (1024 * 1024)  # MB
            print(f"🎉 Eseguibile creato: {exe_path}")
            print(f"📊 Dimensione: {file_size:.1f} MB")
            
            # Crea cartella di release
            release_dir = "release"
            os.makedirs(release_dir, exist_ok=True)
            
            # Copia eseguibile nella cartella release
            release_exe = os.path.join(release_dir, os.path.basename(exe_path))
            shutil.copy2(exe_path, release_exe)
            print(f"📁 Copiato in: {release_exe}")
            
            return True
        else:
            print("❌ Eseguibile non trovato dopo la build!")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"❌ Errore durante la build:")
        print(f"STDOUT: {e.stdout}")
        print(f"STDERR: {e.stderr}")
        return False
    except FileNotFoundError:
        print("❌ PyInstaller non trovato!")
        print("💡 Installa PyInstaller con: pip install pyinstaller")
        return False

def create_version_file():
    """Crea file di versione per Windows"""
    version_content = """# UTF-8
#
# Per informazioni sulla sintassi di questo file, vedi:
# https://msdn.microsoft.com/en-us/library/aa381058(VS.85).aspx

VSVersionInfo(
  ffi=FixedFileInfo(
    filevers=(1,0,0,0),
    prodvers=(1,0,0,0),
    mask=0x3f,
    flags=0x0,
    OS=0x40004,
    fileType=0x1,
    subtype=0x0,
    date=(0, 0)
    ),
  kids=[
    StringFileInfo(
      [
      StringTable(
        u'040904B0',
        [StringStruct(u'CompanyName', u'Psytec'),
        StringStruct(u'FileDescription', u'Psytec Server Connector'),
        StringStruct(u'FileVersion', u'1.0.0.0'),
        StringStruct(u'InternalName', u'PsytecServerConnector'),
        StringStruct(u'LegalCopyright', u'© 2025 Psytec'),
        StringStruct(u'OriginalFilename', u'PsytecServerConnector.exe'),
        StringStruct(u'ProductName', u'Psytec Server Connector'),
        StringStruct(u'ProductVersion', u'1.0.0.0')])
      ]), 
    VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
  ]
)"""
    
    with open("version_info.txt", "w", encoding="utf-8") as f:
        f.write(version_content)
    print("📝 File di versione creato")

def cleanup():
    """Pulisce file temporanei"""
    dirs_to_remove = ["build", "__pycache__"]
    files_to_remove = ["*.spec", "version_info.txt"]
    
    for dir_name in dirs_to_remove:
        if os.path.exists(dir_name):
            shutil.rmtree(dir_name)
            print(f"🧹 Rimossa cartella: {dir_name}")
    
    import glob
    for pattern in files_to_remove:
        for file_path in glob.glob(pattern):
            os.remove(file_path)
            print(f"🧹 Rimosso file: {file_path}")

def main():
    """Funzione principale"""
    print("=" * 50)
    print("🔨 PSYTEC SERVER CONNECTOR - BUILD SCRIPT")
    print("=" * 50)
    
    # Crea file di versione per Windows
    if sys.platform == "win32":
        create_version_file()
    
    # Crea eseguibile
    success = create_executable()
    
    if success:
        print("\n" + "=" * 50)
        print("🎉 BUILD COMPLETATA CON SUCCESSO!")
        print("=" * 50)
        print("📁 Trova l'eseguibile in: release/")
        print("🚀 Pronto per il test su PC vergine!")
        
        # Pulisci file temporanei
        cleanup()
        
    else:
        print("\n" + "=" * 50)
        print("❌ BUILD FALLITA")
        print("=" * 50)
        print("💡 Controlla gli errori sopra")

if __name__ == "__main__":
    main()