# 📋 Análisis Profundo: Script setup_cd_project.sh

## 🎯 Objetivo
Analizar en profundidad el script `setup_cd_project.sh` para identificar qué datos, configuraciones y entorno deben prepararse o entregarse al sistema para que quede correctamente alineado al nuevo proyecto.

---

## ✅ Lo que el Script Hace Actualmente

### 1. **Verificaciones Iniciales**
- ✅ Verifica dependencias: `composer`, `php`
- ✅ Verifica que estemos en el directorio correcto (composer.json, artisan)

### 2. **Datos que Solicita**
- ✅ `PROJECT_NAME` - Nombre del proyecto (ej: fundacionchaka)
- ✅ `DB_NAME` - Nombre de la base de datos
- ✅ Si está en cPanel:
  - ✅ `DB_USER` - Usuario de BD
  - ✅ `DB_PASS` - Contraseña de BD
  - ✅ `GA_ID` - Google Analytics ID

### 3. **Configuraciones que Aplica**
- ✅ Crea `.env` desde `.env.example` (si no existe)
- ✅ Actualiza `APP_NAME` con el nombre del proyecto
- ✅ Actualiza `DB_DATABASE` con el nombre de la BD
- ✅ Establece `RUN_PROJECT_SEEDER=true`
- ✅ Si es cPanel:
  - ✅ Actualiza `DB_USERNAME`
  - ✅ Actualiza `DB_PASSWORD`
  - ✅ Actualiza `GOOGLE_ANALYTICS_ID`
  - ✅ Establece `APP_ENV=production`

### 4. **Operaciones que Ejecuta**
- ✅ `composer update --no-interaction`
- ✅ `php artisan key:generate`
- ✅ `php artisan optimize:clear`
- ✅ `php artisan storage:link`
- ✅ `php artisan migrate:fresh --seed`

---

## ⚠️ Lo que FALTA o DEBE MEJORARSE

### 🔴 CRÍTICO: Variables de Entorno Faltantes

#### 1. **Configuración de Base de Datos**
El script **NO configura** estas variables esenciales:

```bash
# ❌ FALTA en el script
DB_HOST=127.0.0.1          # Por defecto en .env.example, pero puede variar
DB_PORT=3306               # Por defecto en .env.example, pero puede variar
DB_CONNECTION=mysql        # Por defecto, pero debería validarse
```

**Problema**: Si el servidor usa un host/puerto diferente (común en cPanel), la conexión fallará.

**Solución Recomendada**:
```bash
# Si NO es cPanel, preguntar:
read -p "🔧 Ingresá el host de la base de datos (default: 127.0.0.1): " DB_HOST
DB_HOST=${DB_HOST:-127.0.0.1}

read -p "🔧 Ingresá el puerto de la base de datos (default: 3306): " DB_PORT
DB_PORT=${DB_PORT:-3306}
```

#### 2. **Configuración de URL de la Aplicación**
```bash
# ❌ FALTA en el script
APP_URL=http://localhost    # Crítico para producción
```

**Problema**: En producción, `APP_URL` debe ser la URL real del sitio. Sin esto, los enlaces generados serán incorrectos.

**Solución Recomendada**:
```bash
read -p "🌐 Ingresá la URL del proyecto (ej: https://fundacionchaka.com): " APP_URL
# Si está vacío, usar localhost para desarrollo
APP_URL=${APP_URL:-http://localhost}
```

#### 3. **Configuración de Entorno y Debug**
```bash
# ⚠️ Solo se configura si es cPanel
APP_ENV=production         # Solo si es cPanel
APP_DEBUG=false            # NO se configura nunca
```

**Problema**: `APP_DEBUG` debería ser `false` en producción, pero el script no lo toca.

**Solución Recomendada**:
```bash
if [[ "$CPANEL" == "s" ]]; then
  sed -i "" "s/^APP_DEBUG=.*/APP_DEBUG=false/" .env
fi
```

### 🟡 IMPORTANTE: Archivos JSON Requeridos

El sistema **REQUIERE** estos archivos JSON en `database/seeders/project-data/`:

#### Archivos Obligatorios:
1. ✅ `projects.json` - Proyectos y categorías
2. ✅ `blog.json` - Posts y categorías del blog
3. ✅ `cd-base.json` - FAQs, carousel, noticias
4. ✅ `gallery.json` - Galería de imágenes
5. ✅ `products.json` - Productos y categorías
6. ✅ `references.json` - Referencias
7. ✅ `services.json` - Servicios (si se usa ServiceSeeder)
8. ✅ `team.json` - Miembros del equipo

**Problema**: El script **NO verifica** si estos archivos existen antes de ejecutar `migrate:fresh --seed`.

**Solución Recomendada**:
```bash
# Verificar archivos JSON requeridos
REQUIRED_JSON_FILES=(
  "database/seeders/project-data/projects.json"
  "database/seeders/project-data/blog.json"
  "database/seeders/project-data/cd-base.json"
  "database/seeders/project-data/gallery.json"
  "database/seeders/project-data/products.json"
  "database/seeders/project-data/references.json"
  "database/seeders/project-data/team.json"
)

echo -e "${YELLOW}Verificando archivos JSON requeridos...${NC}"
MISSING_FILES=()
for file in "${REQUIRED_JSON_FILES[@]}"; do
  if [ ! -f "$file" ]; then
    MISSING_FILES+=("$file")
    echo -e "${RED}❌ Faltante: $file${NC}"
  else
    echo -e "${GREEN}✅ Encontrado: $file${NC}"
  fi
done

if [ ${#MISSING_FILES[@]} -gt 0 ]; then
  echo -e "${RED}Error: Faltan archivos JSON requeridos.${NC}"
  echo -e "${YELLOW}Por favor, asegúrate de tener todos los archivos en database/seeders/project-data/${NC}"
  exit 1
fi
```

### 🟡 IMPORTANTE: Configuración de Correo

```bash
# ❌ FALTA en el script
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME="${PROJECT_NAME}"
```

**Problema**: Si el proyecto necesita enviar correos (formularios de contacto, notificaciones), estas configuraciones son críticas.

**Solución Recomendada**:
```bash
read -p "📧 ¿Configurar correo? (s/n): " CONFIGURE_MAIL
if [[ "$CONFIGURE_MAIL" == "s" ]]; then
  read -p "📧 MAIL_HOST (ej: smtp.gmail.com): " MAIL_HOST
  read -p "📧 MAIL_PORT (default: 587): " MAIL_PORT
  MAIL_PORT=${MAIL_PORT:-587}
  read -p "📧 MAIL_USERNAME: " MAIL_USERNAME
  read -s -p "📧 MAIL_PASSWORD: " MAIL_PASSWORD
  echo
  read -p "📧 MAIL_FROM_ADDRESS (ej: noreply@$PROJECT_NAME.com): " MAIL_FROM_ADDRESS
  
  # Actualizar .env
  sed -i "" "s/^MAIL_HOST=.*/MAIL_HOST=$MAIL_HOST/" .env
  sed -i "" "s/^MAIL_PORT=.*/MAIL_PORT=$MAIL_PORT/" .env
  sed -i "" "s/^MAIL_USERNAME=.*/MAIL_USERNAME=$MAIL_USERNAME/" .env
  sed -i "" "s/^MAIL_PASSWORD=.*/MAIL_PASSWORD=$MAIL_PASSWORD/" .env
  sed -i "" "s|^MAIL_FROM_ADDRESS=.*|MAIL_FROM_ADDRESS=$MAIL_FROM_ADDRESS|" .env
  sed -i "" "s|^MAIL_FROM_NAME=.*|MAIL_FROM_NAME=\"$PROJECT_NAME\"|" .env
fi
```

### 🟡 IMPORTANTE: Usuario Administrador

El script muestra al final:
```
Usuario demo: admin@$PROJECT_NAME.com
Contraseña demo: password
```

**Problema**: 
1. El `UsersSeeder` crea usuarios con lógica diferente:
   - Usuario 1: `coke@lacompaniadigital.com` / `demo`
   - Usuario 2: `admin@{slug_proyecto}.com` / `{Proyecto}2025`

2. El script asume que la contraseña es `password`, pero el seeder usa `{Proyecto}2025`.

**Solución Recomendada**:
```bash
# Después de ejecutar migrate:fresh --seed
echo -e "\n${YELLOW}Usuarios creados:${NC}"
echo -e "${GREEN}1. coke@lacompaniadigital.com / demo${NC}"
echo -e "${GREEN}2. admin@${PROJECT_NAME}.com / ${PROJECT_NAME}2025${NC}"
```

### 🟢 MEJORAS RECOMENDADAS

#### 1. **Validación de Conexión a BD**
Antes de ejecutar migraciones, verificar que la conexión funciona:

```bash
# Verificar conexión a BD
echo -e "${YELLOW}Verificando conexión a la base de datos...${NC}"
php artisan db:show --ansi 2>&1 | grep -q "Connection" && echo -e "${GREEN}✅ Conexión exitosa${NC}" || {
  echo -e "${RED}❌ Error de conexión a la base de datos${NC}"
  echo -e "${YELLOW}Verifica las credenciales en .env${NC}"
  exit 1
}
```

#### 2. **Backup de BD (si existe)**
Si la BD ya tiene datos, hacer backup antes de `migrate:fresh`:

```bash
# Verificar si la BD tiene tablas
TABLES=$(php artisan db:show --ansi 2>&1 | grep -c "Tables:" || echo "0")
if [ "$TABLES" -gt 0 ]; then
  read -p "⚠️  La base de datos ya tiene datos. ¿Hacer backup? (s/n): " BACKUP
  if [[ "$BACKUP" == "s" ]]; then
    BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).sql"
    mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_FILE"
    echo -e "${GREEN}✅ Backup guardado en: $BACKUP_FILE${NC}"
  fi
fi
```

#### 3. **Permisos de Storage**
Verificar permisos de storage:

```bash
# Asegurar permisos correctos
echo -e "${YELLOW}Configurando permisos de storage...${NC}"
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || true
```

#### 4. **Verificación Post-Setup**
Después del setup, verificar que todo funciona:

```bash
# Verificar que las rutas funcionan
echo -e "${YELLOW}Verificando configuración...${NC}"
php artisan route:list --ansi > /dev/null 2>&1 && echo -e "${GREEN}✅ Rutas configuradas${NC}" || echo -e "${RED}❌ Error en rutas${NC}"
php artisan config:cache --ansi > /dev/null 2>&1 && echo -e "${GREEN}✅ Configuración cacheada${NC}" || echo -e "${RED}❌ Error al cachear${NC}"
```

---

## 📦 Checklist de Datos/Configuraciones Necesarias

### ✅ ANTES de Ejecutar el Script

#### 1. **Información del Proyecto**
- [ ] Nombre del proyecto (slug-friendly)
- [ ] URL del proyecto (para producción)
- [ ] Google Analytics ID (si aplica)

#### 2. **Base de Datos**
- [ ] Nombre de la base de datos
- [ ] Usuario de la base de datos
- [ ] Contraseña de la base de datos
- [ ] Host de la base de datos (si no es localhost)
- [ ] Puerto de la base de datos (si no es 3306)

#### 3. **Archivos JSON de Datos**
- [ ] `database/seeders/project-data/projects.json`
- [ ] `database/seeders/project-data/blog.json`
- [ ] `database/seeders/project-data/cd-base.json`
- [ ] `database/seeders/project-data/gallery.json`
- [ ] `database/seeders/project-data/products.json`
- [ ] `database/seeders/project-data/references.json`
- [ ] `database/seeders/project-data/team.json`
- [ ] `database/seeders/project-data/services.json` (opcional)

#### 4. **Configuración de Correo** (si aplica)
- [ ] Servidor SMTP
- [ ] Puerto SMTP
- [ ] Usuario SMTP
- [ ] Contraseña SMTP
- [ ] Email remitente

#### 5. **Entorno**
- [ ] ¿Es producción (cPanel) o desarrollo?
- [ ] ¿Necesita configuración de servicios externos? (Cloudinary, etc.)

---

## 🔧 Variables de Entorno Completas Necesarias

### Base de Datos
```bash
DB_CONNECTION=mysql
DB_HOST=127.0.0.1          # ⚠️ FALTA en script
DB_PORT=3306               # ⚠️ FALTA en script
DB_DATABASE=nombre_bd      # ✅ Configurado
DB_USERNAME=usuario        # ✅ Solo si cPanel
DB_PASSWORD=contraseña     # ✅ Solo si cPanel
```

### Aplicación
```bash
APP_NAME="Nombre Proyecto" # ✅ Configurado
APP_ENV=production         # ✅ Solo si cPanel
APP_DEBUG=false            # ⚠️ FALTA en script
APP_URL=http://localhost   # ⚠️ FALTA en script
APP_KEY=base64:...         # ✅ Generado automáticamente
```

### Google Analytics
```bash
GOOGLE_ANALYTICS_ID=UA-XXXXX-Y  # ✅ Solo si cPanel
```

### Correo (Opcional pero Recomendado)
```bash
MAIL_MAILER=smtp           # ⚠️ FALTA en script
MAIL_HOST=smtp.example.com # ⚠️ FALTA en script
MAIL_PORT=587              # ⚠️ FALTA en script
MAIL_USERNAME=             # ⚠️ FALTA en script
MAIL_PASSWORD=              # ⚠️ FALTA en script
MAIL_ENCRYPTION=tls        # ⚠️ FALTA en script
MAIL_FROM_ADDRESS=         # ⚠️ FALTA en script
MAIL_FROM_NAME=            # ⚠️ FALTA en script
```

### Otros Servicios (Opcionales)
```bash
CLOUDINARY_CLOUD_NAME=     # Para gestión de imágenes
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
```

---

## 🎯 Resumen de Problemas y Soluciones

| Problema | Severidad | Solución |
|----------|-----------|----------|
| No configura `DB_HOST`/`DB_PORT` | 🔴 Crítico | Preguntar al usuario si no es localhost |
| No configura `APP_URL` | 🔴 Crítico | Preguntar URL del proyecto |
| No configura `APP_DEBUG=false` en producción | 🟡 Importante | Agregar cuando es cPanel |
| No verifica archivos JSON requeridos | 🟡 Importante | Validar antes de seedear |
| No configura correo | 🟡 Importante | Preguntar si necesita correo |
| Información incorrecta de usuario demo | 🟢 Menor | Corregir mensaje final |
| No valida conexión a BD | 🟢 Menor | Agregar validación |
| No hace backup antes de `migrate:fresh` | 🟢 Menor | Preguntar si hacer backup |

---

## 📝 Recomendaciones Finales

1. **Mejorar el script** para incluir todas las configuraciones críticas mencionadas.
2. **Crear un checklist** que el usuario complete antes de ejecutar el script.
3. **Validar archivos JSON** antes de ejecutar seeders.
4. **Documentar** qué archivos JSON son obligatorios y cuáles opcionales.
5. **Agregar modo interactivo** para configuraciones opcionales (correo, servicios externos).
6. **Mejorar mensajes de error** para guiar al usuario cuando algo falla.

---

## 🔗 Archivos Relacionados

- Script: `scripts/setup_cd_project.sh`
- Seeders: `database/seeders/`
- Datos: `database/seeders/project-data/*.json`
- Configuración: `.env.example`
- Documentación: `docs/cd-system/`

---

**Última actualización**: $(date +%Y-%m-%d)

