#!/usr/bin/env bash
set -euo pipefail

stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export stpRoot

source "$stpRoot/lib/log.sh"
source "$stpRoot/lib/utils.sh"

export verbose="${verbose:-false}"

selectedModule=""
skipModules=()

readModuleOrder() {
    grep -v '^\s*#' "$stpRoot/config/modules" | grep -v '^\s*$'
}

usage() {
    cat <<EOF
Uso: stp.sh [opciones]

Opciones:
  -m, --module <nombre>   Ejecutar solo este módulo (ej: packages)
  -s, --skip <nombre>     Saltear módulo, puede repetirse
  -v, --verbose           Salida detallada
  -l, --list              Listar módulos en orden de ejecución
  -h, --help              Mostrar esta ayuda

Ejemplos:
  stp.sh                        # Ejecutar todos los módulos
  stp.sh -m packages            # Solo instalar paquetes
  stp.sh -s video -s audio      # Saltear video y audio
EOF
}

listModules() {
    echo "Módulos (en orden de ejecución):"
    while IFS= read -r name; do
        local modulePath="$stpRoot/modules/${name}.sh"
        if [[ -f "$modulePath" ]]; then
            printf "  %s\n" "$name"
        else
            printf "  %s  (⚠ no encontrado: modules/%s.sh)\n" "$name" "$name"
        fi
    done < <(readModuleOrder)
}

shouldSkip() {
    local moduleName="$1"
    for skip in "${skipModules[@]:-}"; do
        [[ "$moduleName" == "$skip" ]] && return 0
    done
    return 1
}

runModule() {
    local moduleName="$1"
    local modulePath="$stpRoot/modules/${moduleName}.sh"

    if [[ ! -f "$modulePath" ]]; then
        log::error "Módulo no encontrado: modules/${moduleName}.sh"
        return 1
    fi

    if shouldSkip "$moduleName"; then
        log::warn "Salteando: $moduleName"
        return 0
    fi

    log::step "$moduleName"
    if ! bash "$modulePath"; then
        log::error "Falló el módulo: $moduleName (ver $stpLogFile)"
        return 1
    fi
}

while [[ $# -gt 0 ]]; do
    case "$1" in
        -m|--module)  selectedModule="$2"; shift 2 ;;
        -s|--skip)    skipModules+=("$2"); shift 2 ;;
        -v|--verbose) verbose=true; shift ;;
        -l|--list)    listModules; exit 0 ;;
        -h|--help)    usage; exit 0 ;;
        *) log::error "Opción desconocida: $1"; usage; exit 1 ;;
    esac
done

printf '\n'
log::step "Sistema de Transferencia Personal"
log::info "Log: $stpLogFile"
printf '\n'

util::requireSudo

if [[ -n "$selectedModule" ]]; then
    if [[ ! -f "$stpRoot/modules/${selectedModule}.sh" ]]; then
        log::error "Módulo no encontrado: $selectedModule"
        listModules
        exit 1
    fi
    runModule "$selectedModule"
else
    while IFS= read -r moduleName; do
        runModule "$moduleName"
        printf '\n'
    done < <(readModuleOrder)
fi

printf '\n'
log::ok "STP completado. Log completo en: $stpLogFile"
