import os
import re
import subprocess
import gzip

backups_dir = r"d:\wamp64\www\agents\Backups"
mysql_exe = r"d:\wamp64\bin\mysql\mysql5.7.19\bin\mysql.exe"
db_user = "root"
db_pass = "vertrigo"

def main():
    if not os.path.exists(backups_dir):
        print(f"Directorio no encontrado: {backups_dir}", flush=True)
        return

    files = [f for f in os.listdir(backups_dir) if f.endswith(".sql.gz")]
    
    if not files:
        print("No se encontraron archivos .sql.gz", flush=True)
        return

    print(f"Se encontraron {len(files)} backups para procesar.\n", flush=True)

    for filename in files:
        # Extraer nombre de la base de datos usando el patrón de la fecha _20XX-
        match = re.match(r'^(.*?)_20\d{2}-\d{2}-\d{2}_', filename)
        if not match:
            print(f"No se pudo determinar el nombre de la BD para: {filename}", flush=True)
            continue
            
        db_name = match.group(1)
        file_path = os.path.join(backups_dir, filename)
        
        print(f"Procesando BD: `{db_name}` desde `{filename}`...", flush=True)
        
        # 1. Crear/Recrear la base de datos
        recreate_cmd = [
            mysql_exe, 
            "-u", db_user, 
            f"-p{db_pass}", 
            "-e", f"DROP DATABASE IF EXISTS `{db_name}`; CREATE DATABASE `{db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
        ]
        
        try:
            print(f"  -> Recreando base de datos...", flush=True)
            subprocess.run(recreate_cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        except subprocess.CalledProcessError as e:
            print(f"  [ERROR] Al recrear BD {db_name}: {e.stderr.decode('latin1', errors='ignore')}", flush=True)
            continue

        # 2. Restaurar el backup con reemplazo de collation incompatible (MySQL 8 a MySQL 5.7)
        import_cmd = [
            mysql_exe,
            "-u", db_user,
            f"-p{db_pass}",
            db_name
        ]
        
        print(f"  -> Descomprimiendo, ajustando collation e importando datos...", flush=True)
        try:
            proc = subprocess.Popen(import_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            with gzip.open(file_path, 'rb') as f_in:
                # Leer línea por línea para reemplazar la collation problemática
                for line in f_in:
                    # Reemplazar utf8mb4_0900_ai_ci por utf8mb4_unicode_ci que es soportado por MySQL 5.7
                    if b'utf8mb4_0900_ai_ci' in line:
                        line = line.replace(b'utf8mb4_0900_ai_ci', b'utf8mb4_unicode_ci')
                    proc.stdin.write(line)
            
            proc.stdin.close()
            out, err = proc.communicate()
            
            if proc.returncode == 0:
                print(f"  [OK] Restauración completada para {db_name}\n", flush=True)
            else:
                print(f"  [ERROR] Al importar {db_name}: {err.decode('latin1', errors='ignore')}\n", flush=True)
                
        except Exception as e:
            print(f"  [EXCEPCION] Fallo importando {db_name}: {e}\n", flush=True)

    print("\n¡Proceso finalizado!", flush=True)

if __name__ == "__main__":
    main()
