#!/usr/bin/env python3
"""
Script para construir el ejecutable de Wabi con PyInstaller.
Ejecutar: python build.py
"""

import os
import shutil
import subprocess
import sys
from pathlib import Path

def main():
    base_dir = Path(__file__).resolve().parent
    dist_dir = base_dir / "dist"
    build_dir = base_dir / "build"
    spec_file = base_dir / "wabi.spec"

    print("🔨 Iniciando construcción de Wabi...")
    print(f"📁 Directorio base: {base_dir}")

    # Limpiar directorios previos
    print("\n🧹 Limpiando directorios previos...")
    for directory in [dist_dir, build_dir, spec_file]:
        if isinstance(directory, Path) and directory.exists():
            if directory.is_dir():
                shutil.rmtree(directory)
                print(f"  ✓ Eliminado: {directory}")
            else:
                directory.unlink()
                print(f"  ✓ Eliminado: {directory}")

    # Crear spec file para PyInstaller
    print("\n📝 Creando configuración de PyInstaller...")

    spec_content = f'''# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_files, collect_submodules
from PyInstaller.building.build_main import Analysis, PYZ, EXE, COLLECT

block_cipher = None

# Recolectar datos necesarios
datas = []
datas += collect_data_files('customtkinter')

a = Analysis(
    [r'{base_dir / "main.py"}'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=[
        'customtkinter',
        'pandas',
        'openpyxl',
        'selenium',
        'undetected_chromedriver',
        'tkinter',
    ],
    hookspath=[],
    hooksconfig={{}},
    runtime_hooks=[],
    excludedimports=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='Wabi',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=None,
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='Wabi',
)
'''

    spec_file.write_text(spec_content)
    print(f"  ✓ Archivo spec creado: {spec_file.name}")

    # Ejecutar PyInstaller
    print("\n🚀 Ejecutando PyInstaller...")
    try:
        result = subprocess.run(
            [sys.executable, "-m", "PyInstaller", str(spec_file), "--distpath", str(dist_dir), "--workpath", str(build_dir)],
            cwd=base_dir,
            capture_output=True,
            text=True
        )

        if result.returncode != 0:
            print(f"❌ Error en PyInstaller:")
            print(result.stdout)
            print(result.stderr)
            return False

        print(result.stdout)

    except Exception as e:
        print(f"❌ Error ejecutando PyInstaller: {e}")
        return False

    # Verificar que se creó el ejecutable
    exe_path = dist_dir / "Wabi" / "Wabi.exe"
    if exe_path.exists():
        print(f"\n✅ ¡Construcción exitosa!")
        print(f"📦 Ejecutable creado: {exe_path}")
        print(f"\n📍 Ubicación: {dist_dir / 'Wabi'}")
        print("\n💡 Puedes ejecutar: Wabi.exe o crear un acceso directo")
        return True
    else:
        print(f"❌ No se encontró el ejecutable en {exe_path}")
        return False

if __name__ == "__main__":
    success = main()
    sys.exit(0 if success else 1)
