"""
Ejecuta todos los scripts de socios_accionistas en orden.

Uso:
    python ejecutar_todos.py
"""

import logging
import os
import pathlib
import socket
import subprocess
import sys

SCRIPTS_DIR = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(SCRIPTS_DIR.parent.parent))

from helpers.db import ejecutar_sp
from helpers.logging_setup import setup_logging, setup_logging_db

ID_PROCESO = int(os.getenv("ID_PROCESO_SOCIOS_ACCIONISTAS", 0))

SCRIPTS = [
    "update_sociedades_constituciones.py",
    "update_personas.py",
    "update_personas_socios.py",
    "update_personas_no_socios.py",
    "update_vinculaciones.py",
    "update_vinculadas_socios.py",
]


def run_script(script_name):
    script_path = SCRIPTS_DIR / script_name
    logging.info(f"Iniciando {script_name}")
    result = subprocess.run(
        [sys.executable, str(script_path)],
        capture_output=True,
        text=True,
    )
    for line in result.stdout.splitlines():
        if line.strip():
            logging.info(f"  [{script_name}] {line.strip()}")
    for line in result.stderr.splitlines():
        if line.strip():
            logging.error(f"  [{script_name}] STDERR: {line.strip()}")
    if result.returncode != 0:
        logging.error(f"FALLO {script_name} (código {result.returncode})")
        return False
    logging.info(f"OK    {script_name}")
    return True


def main():
    run_id = setup_logging("socios_accionistas")
    logging.info("=" * 60)
    logging.info(f"INICIO — socios_accionistas ({len(SCRIPTS)} scripts)")
    logging.info("=" * 60)

    ok = []
    error = []

    for script in SCRIPTS:
        if run_script(script):
            ok.append(script)
        else:
            error.append(script)

    logging.info("=" * 60)
    logging.info(f"Exitosos  ({len(ok)}): {', '.join(ok) or 'ninguno'}")
    logging.info(f"Con error ({len(error)}): {', '.join(error) or 'ninguno'}")
    logging.info("FIN")

    return len(SCRIPTS), len(ok), len(error)


if __name__ == "__main__":
    id_log = None
    try:
        result = ejecutar_sp('PRS_iniciar', [
            ID_PROCESO,
            socket.gethostbyname(socket.gethostname()),
            os.getpid(),
            socket.gethostname(),
            12,
            run_id,
        ])
        if result:
            id_log = result[0].get('id_log')
            setup_logging_db(id_log)
    except Exception as e:
        logging.warning(f"PRS_iniciar falló: {e}")

    total = ok_count = error_count = 0
    try:
        total, ok_count, error_count = main()
    except Exception as e:
        error_count = 1
        logging.error(f"ERROR_FATAL | main: {e}")
    finally:
        if id_log is not None:
            try:
                ejecutar_sp('PRS_finalizar', [id_log, None, total, ok_count, error_count])
            except Exception as e:
                logging.warning(f"PRS_finalizar falló: {e}")
