import socket
import time
import subprocess
import sys
import os

# --- Configuración ---
DB_HOST = os.environ.get("HOST", "db")
DB_PORT = int(os.environ.get("PORT", 5432))
ODOO_CONF = "/etc/odoo/odoo.conf"
DB_NAME = "lims_demo"
MODULES_TO_INSTALL = "base,sale_management,stock,account,lims_management"

# --- Lógica de espera de PostgreSQL ---
print(f"Esperando a PostgreSQL en {DB_HOST}:{DB_PORT}...")
sys.stdout.flush()

while True:
    try:
        with socket.create_connection((DB_HOST, DB_PORT), timeout=2):
            print("PostgreSQL está listo.")
            sys.stdout.flush()
            break
    except (socket.timeout, ConnectionRefusedError, OSError) as e:
        print(f"PostgreSQL no está listo todavía ({e}), esperando...")
        sys.stdout.flush()
        time.sleep(2)

# --- Lógica de inicialización de Odoo ---
print(f"Creando base de datos '{DB_NAME}' e instalando módulos...")
sys.stdout.flush()

odoo_command = [
    "odoo",
    "-c", ODOO_CONF,
    "-d", DB_NAME,
    "-i", MODULES_TO_INSTALL,
    "--load-language", "es_ES",
    "--stop-after-init"
]

# Usamos subprocess.run para tener mejor control sobre la salida
try:
    result = subprocess.run(
        odoo_command,
        capture_output=True,
        text=True,
        check=False 
    )

    print("--- Odoo stdout ---")
    print(result.stdout)
    print("--- Odoo stderr ---")
    print(result.stderr)
    sys.stdout.flush()

    if result.returncode != 0:
        print(f"Odoo falló con código de salida {result.returncode}")
        sys.exit(result.returncode)

    print("Inicialización de Odoo completada exitosamente.")

    # --- Lógica para crear datos de demostración personalizados ---
    print("Creando solicitudes de laboratorio de demostración...")
    sys.stdout.flush()

    with open("/app/create_lab_requests.py", "r") as f:
        script_content = f.read()

    # Reutilizamos el entorno de Odoo para ejecutar un script
    create_requests_command = f"""
        odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF'
{script_content}
EOF
    """

    try:
        result = subprocess.run(
            create_requests_command,
            shell=True,
            capture_output=True,
            text=True,
            check=False
        )

        print("--- Create Lab Requests stdout ---")
        print(result.stdout)
        print("--- Create Lab Requests stderr ---")
        print(result.stderr)
        sys.stdout.flush()

        if result.returncode != 0:
            print(f"Fallo al crear las solicitudes de laboratorio con código de salida {result.returncode}")
            sys.exit(result.returncode)

        print("Solicitudes de laboratorio de demostración creadas exitosamente.")
        
        # --- Crear datos de demostración de pruebas ---
        print("\nCreando datos de demostración de pruebas de laboratorio...")
        sys.stdout.flush()
        
        if os.path.exists("/app/test/create_test_demo_data.py"):
            with open("/app/test/create_test_demo_data.py", "r") as f:
                test_script_content = f.read()
            
            create_tests_command = f"""
                odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF'
{test_script_content}
EOF
            """
            
            result = subprocess.run(
                create_tests_command,
                shell=True,
                capture_output=True,
                text=True,
                check=False
            )
            
            print("--- Create Test Demo Data stdout ---")
            print(result.stdout)
            print("--- Create Test Demo Data stderr ---")
            print(result.stderr)
            sys.stdout.flush()
            
            if result.returncode == 0:
                print("Datos de demostración de pruebas creados exitosamente.")
            else:
                print(f"Advertencia: Fallo al crear datos de demostración de pruebas (código {result.returncode})")
        
        # --- Actualizar logo de la empresa ---
        print("\nActualizando logo de la empresa...")
        sys.stdout.flush()
        
        if os.path.exists("/app/scripts/update_company_logo_odoo18.py"):
            with open("/app/scripts/update_company_logo_odoo18.py", "r") as f:
                logo_script_content = f.read()
            
            update_logo_command = f"""
                odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF'
{logo_script_content}
EOF
            """
            
            result = subprocess.run(
                update_logo_command,
                shell=True,
                capture_output=True,
                text=True,
                check=False
            )
            
            print("--- Update Company Logo stdout ---")
            print(result.stdout)
            print("--- Update Company Logo stderr ---")
            print(result.stderr)
            sys.stdout.flush()
            
            if result.returncode == 0:
                print("Logo de empresa actualizado exitosamente.")
            else:
                print(f"Advertencia: Fallo al actualizar logo de empresa (código {result.returncode})")
        
        # --- Validación final del logo ---
        print("\nValidando estado final del logo y nombre...")
        sys.stdout.flush()
        
        if os.path.exists("/app/test/verify_company_logo.py"):
            with open("/app/test/verify_company_logo.py", "r") as f:
                verify_script_content = f.read()
            
            verify_command = f"""
                odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF'
{verify_script_content}
EOF
            """
            
            result = subprocess.run(
                verify_command,
                shell=True,
                capture_output=True,
                text=True,
                check=False
            )
            
            print("--- Verify Company Logo stdout ---")
            print(result.stdout)
            
        sys.exit(0)

    except Exception as e:
        print(f"Ocurrió un error inesperado al crear las solicitudes de laboratorio: {e}")
        sys.exit(1)

except FileNotFoundError:
    print("Error: El comando 'odoo' no se encontró. Asegúrate de que la imagen del contenedor es correcta y odoo está en el PATH.")
    sys.exit(1)
except Exception as e:
    print(f"Ocurrió un error inesperado al ejecutar Odoo: {e}")
    sys.exit(1)