#!/bin/bash
# New-Unity ERP | deploy.sh | v3.2 | 05/08/2026
# v3.2 — Genera plantillas Excel SAT (sat:generate-templates) en fresh y update.
# v3.1 — Seeder order fixed: module permission seeders before RolesAndPermissionsSeeder.
#         npm install && npm run build (previously npm install --silent + npm run build separately).
# Script de despliegue automático — AlmaLinux / cPanel
# Uso: bash deploy.sh [fresh]
# fresh = instalación desde cero (nuevo servidor)
# sin argumento = actualización de servidor existente

# ============================================================
# DETECTAR PHP CORRECTO
# ============================================================
if [ -x "/opt/cpanel/ea-php83/root/usr/bin/php" ]; then
    PHP="/opt/cpanel/ea-php83/root/usr/bin/php"
elif [ -x "/usr/bin/php8.3" ]; then
    PHP="/usr/bin/php8.3"
elif [ -x "/usr/bin/php" ]; then
    PHP="/usr/bin/php"
else
    echo "❌ No se encontró PHP 8.3. Instálalo antes de continuar."
    exit 1
fi

# Detectar Composer
if [ -x "$HOME/bin/composer" ]; then
    COMPOSER="$PHP $HOME/bin/composer"
elif command -v composer &> /dev/null; then
    COMPOSER="$PHP $(which composer)"
else
    echo "❌ Composer no encontrado. Instálalo antes de continuar."
    exit 1
fi

# Detectar Node y NPM
NODE=$(which node 2>/dev/null || echo "")
NPM=$(which npm 2>/dev/null || echo "")

APP_PATH="$(pwd)"
CRON_CMD="* * * * * ${PHP} ${APP_PATH}/artisan queue:work --stop-when-empty 2>/dev/null"

# ============================================================
# COLORES
# ============================================================
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

ok()   { echo -e "${GREEN}  ✅ $1${NC}"; }
warn() { echo -e "${YELLOW}  ⚠️  $1${NC}"; }
err()  { echo -e "${RED}  ❌ $1${NC}"; exit 1; }
step() { echo -e "\n${YELLOW}[$1] $2...${NC}"; }

run_seeder() {
    local CLASS=$1
    local LABEL=$2
    if $PHP artisan db:seed --class="$CLASS" --force 2>/dev/null; then
        ok "$LABEL"
    else
        warn "$LABEL omitido (clase no encontrada o ya ejecutado)"
    fi
}

# ============================================================
echo ""
echo "========================================"
echo "  New-Unity ERP — Deploy v3.1"
echo "  PHP: $PHP"
echo "========================================"
echo ""

cd "$APP_PATH" || err "No se encontró el directorio $APP_PATH"

# ============================================================
# MODO FRESH (instalación desde cero)
# ============================================================
if [ "$1" = "fresh" ]; then
    echo -e "${YELLOW}  MODO: Instalación desde cero${NC}"

    step "1/13" "Verificando repositorio"
    ok "Repositorio listo en $APP_PATH"

    step "2/13" "Instalando dependencias PHP"
    $COMPOSER install --no-dev --optimize-autoloader --ignore-platform-req=ext-fileinfo
    ok "Composer listo"

    step "3/13" "Configurando .env"
    if [ ! -f ".env" ]; then
        cp .env.example .env
        warn "Creado .env desde .env.example — edita las variables antes de continuar"
        warn "Mínimo requerido: APP_KEY, DB_*, QUEUE_CONNECTION=database"
        read -p "  Presiona ENTER cuando hayas editado el .env..."
    else
        ok ".env ya existe"
    fi

    if grep -q "QUEUE_CONNECTION=sync" .env; then
        sed -i 's/QUEUE_CONNECTION=sync/QUEUE_CONNECTION=database/' .env
        ok "QUEUE_CONNECTION cambiado a database"
    else
        ok "QUEUE_CONNECTION ya configurado"
    fi

    step "4/13" "Generando APP_KEY"
    $PHP artisan key:generate --force
    ok "APP_KEY generada"

    step "5/13" "Creando tabla de jobs (queue)"
    $PHP artisan queue:table 2>/dev/null || true
    ok "Migración de jobs lista"

    step "6/13" "Corriendo migraciones"
    $PHP artisan migrate --force
    ok "Migraciones completas"

    step "7/13" "Corriendo seeders — CORE"
    run_seeder "App\\Modules\\Admin\\Database\\Seeders\\CoreModuleSeeder"        "CoreModuleSeeder"
    run_seeder "App\\Modules\\Admin\\Database\\Seeders\\AdminUserSeeder"         "AdminUserSeeder"
    run_seeder "App\\Modules\\Admin\\Database\\Seeders\\BreakGlassSeeder"        "BreakGlassSeeder"

    step "8/13" "Corriendo seeders — ROLES Y PERMISOS"
    # Módulos primero — crean los permisos individuales que RolesAndPermissionsSeeder asigna a roles
    run_seeder "App\\Modules\\Admin\\Database\\Seeders\\AdminPermissionsSeeder"           "AdminPermissionsSeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\BillingPermissionsSeeder"       "BillingPermissionsSeeder"
    run_seeder "App\\Modules\\Finance\\Database\\Seeders\\FinancePermissionsSeeder"       "FinancePermissionsSeeder"
    run_seeder "App\\Modules\\Products\\Database\\Seeders\\ProductsPermissionsSeeder"     "ProductsPermissionsSeeder"
    run_seeder "App\\Modules\\Sales\\Database\\Seeders\\SalesPermissionsSeeder"           "SalesPermissionsSeeder"
    run_seeder "App\\Modules\\Warehouse\\Database\\Seeders\\WarehousePermissionsSeeder"   "WarehousePermissionsSeeder"
    run_seeder "App\\Modules\\Purchases\\Database\\Seeders\\PurchasesPermissionsSeeder"   "PurchasesPermissionsSeeder"
    run_seeder "App\\Modules\\Production\\Database\\Seeders\\ProductionPermissionsSeeder" "ProductionPermissionsSeeder"
    # Asigna permisos a roles — debe correr después de que todos los permisos de módulo existen
    run_seeder "App\\Modules\\Admin\\Database\\Seeders\\RolesAndPermissionsSeeder"        "RolesAndPermissionsSeeder"
    $PHP artisan permission:cache-reset
    ok "Caché de permisos limpiada"

    step "9/13" "Corriendo seeders — CATÁLOGOS Y DATOS BASE"
    run_seeder "App\\Modules\\Products\\Database\\Seeders\\ProductStatusSeeder"     "ProductStatusSeeder"
    run_seeder "App\\Modules\\Finance\\Database\\Seeders\\CurrencySeeder"           "CurrencySeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\BillingCurrencySeeder"    "BillingCurrencySeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\BillingCatalogsSeeder"    "BillingCatalogsSeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\BillingFormatsSeeder"     "BillingFormatsSeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\SatTaxObjectsSeeder"      "SatTaxObjectsSeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\SatTasaOCuotaSeeder"      "SatTasaOCuotaSeeder"
    run_seeder "App\\Modules\\Billing\\Database\\Seeders\\SatCancelReasonsSeeder"   "SatCancelReasonsSeeder"
    run_seeder "App\\Modules\\Sales\\Database\\Seeders\\OpportunityRulesSeeder"     "OpportunityRulesSeeder"

    step "10/13" "Compilando assets"
    if [ -n "$NPM" ] && command -v npm &> /dev/null; then
        npm install && npm run build
        ok "Assets compilados"
    else
        warn "Node/NPM no encontrado — instala Node 20 y corre: npm install && npm run build"
    fi

    step "11/13" "Configurando permisos de carpetas"
    chmod -R 775 storage bootstrap/cache
    ok "Permisos configurados"

    step "12/13" "Configurando storage symlink"
    $PHP artisan storage:link 2>/dev/null || true
    ok "Storage link listo"

    step "12b/13" "Generando plantillas Excel SAT"
    $PHP artisan sat:generate-templates
    ok "Plantillas generadas en public/imports/template/"

    step "13/13" "Configurando cron para queue worker"
    (crontab -l 2>/dev/null | grep -v "queue:work"; echo "$CRON_CMD") | crontab -
    ok "Cron configurado"

    $PHP artisan config:cache
    $PHP artisan route:cache
    $PHP artisan view:clear

    echo ""
    echo "========================================"
    echo -e "${GREEN}  INSTALACIÓN COMPLETA ✅${NC}"
    echo "========================================"
    echo ""
    echo "  Pasos manuales pendientes:"
    echo "  1. Configurar empresa/sucursal desde el Wizard (/setup)"
    echo "  2. Configurar SMTP desde el Wizard"
    echo "  3. Configurar almacén/zonas/racks desde el Wizard"
    echo "  4. Cargar catálogos SAT por importación Excel"
    echo "  5. Configurar tipo de cambio USD/MXN desde Finanzas"
    echo "  6. Configurar PAC (BuzónCFDI) desde Facturación"
    echo ""
    exit 0
fi

# ============================================================
# MODO UPDATE (actualización de servidor existente)
# ============================================================
echo -e "${YELLOW}  MODO: Actualización${NC}"

step "1/8" "Pulling cambios de GitHub"
git pull origin main
ok "Código actualizado"

step "2/8" "Actualizando dependencias PHP"
$COMPOSER install --no-dev --optimize-autoloader --quiet --ignore-platform-req=ext-fileinfo
ok "Composer actualizado"

step "3/8" "Verificando QUEUE_CONNECTION"
if grep -q "QUEUE_CONNECTION=sync" .env; then
    sed -i 's/QUEUE_CONNECTION=sync/QUEUE_CONNECTION=database/' .env
    warn "QUEUE_CONNECTION cambiado a database"
else
    ok "QUEUE_CONNECTION ya en database"
fi

step "4/8" "Corriendo migraciones pendientes"
$PHP artisan migrate --force
ok "Migraciones completas"

step "5/8" "Corriendo seeders de permisos y catálogos"
run_seeder "App\\Modules\\Finance\\Database\\Seeders\\FinancePermissionsSeeder"     "FinancePermissionsSeeder"
run_seeder "App\\Modules\\Billing\\Database\\Seeders\\BillingPermissionsSeeder"     "BillingPermissionsSeeder"
run_seeder "App\\Modules\\Products\\Database\\Seeders\\ProductsPermissionsSeeder"   "ProductsPermissionsSeeder"
run_seeder "App\\Modules\\Sales\\Database\\Seeders\\SalesPermissionsSeeder"         "SalesPermissionsSeeder"
run_seeder "App\\Modules\\Warehouse\\Database\\Seeders\\WarehousePermissionsSeeder" "WarehousePermissionsSeeder"
run_seeder "App\\Modules\\Purchases\\Database\\Seeders\\PurchasesPermissionsSeeder" "PurchasesPermissionsSeeder"
run_seeder "App\\Modules\\Products\\Database\\Seeders\\ProductStatusSeeder"         "ProductStatusSeeder"
run_seeder "App\\Modules\\Billing\\Database\\Seeders\\BillingCurrencySeeder"        "BillingCurrencySeeder"
run_seeder "App\\Modules\\Billing\\Database\\Seeders\\SatTaxObjectsSeeder"          "SatTaxObjectsSeeder"
run_seeder "App\\Modules\\Billing\\Database\\Seeders\\SatTasaOCuotaSeeder"          "SatTasaOCuotaSeeder"
run_seeder "App\\Modules\\Billing\\Database\\Seeders\\SatCancelReasonsSeeder"       "SatCancelReasonsSeeder"
$PHP artisan permission:cache-reset
ok "Seeders y permisos actualizados"

step "6/8" "Verificando si hay cambios de assets"
if git diff HEAD@{1} HEAD --name-only 2>/dev/null | grep -qE "resources/js|resources/css|vite.config"; then
    if [ -n "$NPM" ] && command -v npm &> /dev/null; then
        npm run build
        ok "Assets recompilados"
    else
        warn "Node/NPM no encontrado — corre manualmente: npm run build"
    fi
else
    ok "Sin cambios de assets"
fi

step "7/8" "Verificando cron de queue"
if crontab -l 2>/dev/null | grep -q "queue:work"; then
    ok "Cron ya configurado"
else
    (crontab -l 2>/dev/null; echo "$CRON_CMD") | crontab -
    ok "Cron configurado"
fi

step "7b/8" "Generando plantillas Excel SAT"
$PHP artisan sat:generate-templates
ok "Plantillas generadas en public/imports/template/"

step "8/8" "Limpiando y calentando cachés"
$PHP artisan config:clear
$PHP artisan route:clear
$PHP artisan view:clear
$PHP artisan config:cache
$PHP artisan route:cache
ok "Cachés listos"

echo ""
echo "========================================"
echo -e "${GREEN}  DEPLOY COMPLETO ✅${NC}"
echo "========================================"
echo ""
echo "  Fecha: $(date '+%d/%m/%Y %H:%M:%S')"
echo ""
