# Comandos para Limpiar Módulos

## 📋 Descripción General

Estos comandos permiten limpiar (eliminar) todos los datos de módulos específicos de la base de datos. Son útiles cuando:

- Un módulo está inactivo y quieres liberar espacio
- Necesitas resetear datos de un módulo específico
- Quieres limpiar datos de prueba antes de producción
- Necesitas optimizar la base de datos eliminando módulos no utilizados

## ⚠️ Advertencia Importante

**ESTOS COMANDOS ELIMINAN DATOS PERMANENTEMENTE.** Asegúrate de:

- ✅ Tener un backup de la base de datos antes de ejecutar
- ✅ Verificar que el módulo realmente está inactivo
- ✅ Confirmar que no necesitas esos datos en el futuro

## 🎯 Comando Principal

### `project:clean-module`

Comando genérico que acepta cualquier módulo como argumento.

```bash
php artisan project:clean-module {module} [opciones]
```

**Argumentos:**
- `module` (requerido): Nombre del módulo a limpiar
  - Valores válidos: `blog`, `services`, `faqs`, `gallery`, `projects`, `products`, `team`, `references`, `news`

**Opciones:**
- `--force`: Ejecutar sin confirmación (útil para scripts automatizados)
- `--dry-run`: Simular sin aplicar cambios (muestra qué se eliminaría sin hacerlo)

**Ejemplos:**

```bash
# Limpiar módulo blog con confirmación
php artisan project:clean-module blog

# Limpiar módulo services sin confirmación
php artisan project:clean-module services --force

# Simular limpieza de gallery (no aplica cambios)
php artisan project:clean-module gallery --dry-run
```

## 🔧 Comandos Específicos por Módulo

Para mayor comodidad, existen comandos específicos para cada módulo:

### Blog

```bash
php artisan project:clean-blog [--force] [--dry-run]
```

**Limpia:**
- `posts` - Posts del blog
- `post_categories` - Categorías de posts
- `post_translations` - Traducciones de posts
- `post_category_translations` - Traducciones de categorías

**Ejemplo:**
```bash
php artisan project:clean-blog
php artisan project:clean-blog --dry-run  # Simular
php artisan project:clean-blog --force     # Sin confirmación
```

---

### Services

```bash
php artisan project:clean-services [--force] [--dry-run]
```

**Limpia:**
- `services` - Servicios
- `service_categories` - Categorías de servicios

**Ejemplo:**
```bash
php artisan project:clean-services
php artisan project:clean-services --dry-run
php artisan project:clean-services --force
```

---

### FAQs

```bash
php artisan project:clean-faqs [--force] [--dry-run]
```

**Limpia:**
- `faqs` - Preguntas frecuentes
- `faqs_categories` - Categorías de FAQs

**Ejemplo:**
```bash
php artisan project:clean-faqs
php artisan project:clean-faqs --dry-run
php artisan project:clean-faqs --force
```

---

### Gallery

```bash
php artisan project:clean-gallery [--force] [--dry-run]
```

**Limpia:**
- `galleries` - Galerías
- `gallery_categories` - Categorías de galería
- `gallery_tags` - Tags de galería
- `gallery_gallery_tag` - Relación galería-tag
- `album_picture` - Relación álbum-imagen
- `album_tag` - Relación álbum-tag
- `picture_tag` - Relación imagen-tag

**Ejemplo:**
```bash
php artisan project:clean-gallery
php artisan project:clean-gallery --dry-run
php artisan project:clean-gallery --force
```

---

### Projects

```bash
php artisan project:clean-projects [--force] [--dry-run]
```

**Limpia:**
- `projects` - Proyectos
- `project_categories` - Categorías de proyectos
- `project_category_project` - Relación categoría-proyecto
- `project_tags` - Tags de proyectos
- `project_project_tag` - Relación proyecto-tag

**Ejemplo:**
```bash
php artisan project:clean-projects
php artisan project:clean-projects --dry-run
php artisan project:clean-projects --force
```

---

### Products

```bash
php artisan project:clean-products [--force] [--dry-run]
```

**Limpia:**
- `products` - Productos
- `categories` - Categorías de productos
- `product_tags` - Tags de productos
- `product_product_tag` - Relación producto-tag
- `product_images` - Imágenes de productos
- `product_translations` - Traducciones de productos
- `product_category_translations` - Traducciones de categorías

**Ejemplo:**
```bash
php artisan project:clean-products
php artisan project:clean-products --dry-run
php artisan project:clean-products --force
```

---

### Team

```bash
php artisan project:clean-team [--force] [--dry-run]
```

**Limpia:**
- `team_members` - Miembros del equipo
- `team_categories` - Categorías del equipo

**Ejemplo:**
```bash
php artisan project:clean-team
php artisan project:clean-team --dry-run
php artisan project:clean-team --force
```

---

### References

```bash
php artisan project:clean-references [--force] [--dry-run]
```

**Limpia:**
- `references` - Referencias
- `reference_categories` - Categorías de referencias

**Ejemplo:**
```bash
php artisan project:clean-references
php artisan project:clean-references --dry-run
php artisan project:clean-references --force
```

---

### News

```bash
php artisan project:clean-news [--force] [--dry-run]
```

**Limpia:**
- `news` - Noticias

**Ejemplo:**
```bash
php artisan project:clean-news
php artisan project:clean-news --dry-run
php artisan project:clean-news --force
```

---

## 📊 Funcionalidades

### Modo Dry-Run

El modo `--dry-run` permite simular la operación sin aplicar cambios:

```bash
php artisan project:clean-module blog --dry-run
```

**Salida esperada:**
```
🧹 Limpieza del módulo: blog
🔍 MODO DRY-RUN: No se aplicarán cambios reales

📋 Tablas que se limpiarían:
   - posts (15 registros)
   - post_categories (3 registros)
   - post_translations (30 registros)
   - post_category_translations (6 registros)

🔍 [DRY-RUN] Se eliminarían 15 registros de 'posts'
🔍 [DRY-RUN] Se eliminarían 3 registros de 'post_categories'
...
```

### Confirmación de Seguridad

Por defecto, los comandos solicitan confirmación antes de eliminar datos:

```bash
php artisan project:clean-module blog

⚠️  ADVERTENCIA: Esta acción eliminará 54 registros permanentemente.
¿Estás seguro de que deseas continuar? (yes/no) [no]:
```

### Modo Force

Para scripts automatizados o cuando estás seguro:

```bash
php artisan project:clean-module blog --force
```

Esto ejecuta la limpieza sin solicitar confirmación.

## 🔄 Flujo de Trabajo Recomendado

### 1. Verificar Módulos Activos

Primero, verifica qué módulos están activos:

```bash
php artisan tinker --execute="print_r(array_filter(config('cd-system.modules', []), fn(\$m) => \$m['active'] ?? false));"
```

### 2. Hacer Backup

Siempre haz backup antes de limpiar:

```bash
# Backup de MySQL
mysqldump -u root -p bp-peverosalud > backup_$(date +%Y%m%d_%H%M%S).sql

# O usando Laravel
php artisan backup:run  # Si tienes un paquete de backup
```

### 3. Simular Limpieza

Usa `--dry-run` para ver qué se eliminaría:

```bash
php artisan project:clean-module blog --dry-run
```

### 4. Ejecutar Limpieza

Si estás seguro, ejecuta la limpieza:

```bash
php artisan project:clean-module blog
```

### 5. Verificar Resultado

Verifica que los datos fueron eliminados:

```bash
php artisan tinker --execute="echo 'Posts: ' . DB::table('posts')->count();"
```

## 🛠️ Casos de Uso

### Caso 1: Limpiar Módulo Inactivo

```bash
# 1. Verificar que el módulo está inactivo
php artisan tinker --execute="echo config('cd-system.modules.blog.active') ? 'Activo' : 'Inactivo';"

# 2. Simular limpieza
php artisan project:clean-blog --dry-run

# 3. Ejecutar limpieza
php artisan project:clean-blog
```

### Caso 2: Resetear Módulo para Pruebas

```bash
# Limpiar y luego repoblar
php artisan project:clean-services --force
php artisan db:seed --class=ServiceCategoriesSeeder
php artisan db:seed --class=ProjectsServicesSeeder
```

### Caso 3: Limpiar Múltiples Módulos

```bash
# Limpiar todos los módulos inactivos
php artisan project:clean-blog --force      # Si blog está inactivo
php artisan project:clean-gallery --force   # Si gallery está inactivo
php artisan project:clean-products --force  # Si products está inactivo
```

## 📋 Tabla de Módulos y Tablas

| Módulo | Tablas Limpiadas |
|--------|------------------|
| `blog` | posts, post_categories, post_translations, post_category_translations |
| `services` | services, service_categories |
| `faqs` | faqs, faqs_categories |
| `gallery` | galleries, gallery_categories, gallery_tags, gallery_gallery_tag, album_picture, album_tag, picture_tag |
| `projects` | projects, project_categories, project_category_project, project_tags, project_project_tag |
| `products` | products, categories, product_tags, product_product_tag, product_images, product_translations, product_category_translations |
| `team` | team_members, team_categories |
| `references` | references, reference_categories |
| `news` | news |

## ⚙️ Implementación Técnica

### Manejo de Foreign Keys

Los comandos desactivan temporalmente las verificaciones de foreign keys para evitar errores:

```php
DB::statement('SET FOREIGN_KEY_CHECKS=0');
// ... eliminar registros ...
DB::statement('SET FOREIGN_KEY_CHECKS=1');
```

### Transacciones

Todas las operaciones se ejecutan dentro de una transacción. Si ocurre un error, se hace rollback automáticamente.

### Validación de Tablas

Los comandos verifican que las tablas existan antes de intentar limpiarlas:

```php
if (Schema::hasTable($table)) {
    // Limpiar tabla
} else {
    // Omitir tabla
}
```

## 🔍 Troubleshooting

### Error: "Módulo no reconocido"

**Problema:** El nombre del módulo no es válido.

**Solución:** Verifica que el módulo esté en la lista de módulos válidos:
- blog, services, faqs, gallery, projects, products, team, references, news

### Error: "Tabla no existe"

**Problema:** La tabla no existe en la base de datos.

**Solución:** Esto es normal si el módulo nunca se ha usado. El comando simplemente omite la tabla.

### Error: "Foreign key constraint fails"

**Problema:** Aunque se desactivan las FK, puede haber problemas con relaciones complejas.

**Solución:** Ejecuta el comando con `--force` y verifica el orden de eliminación en el código.

## 🚀 Comando para Limpiar Todos los Módulos Inactivos

### `project:clean-inactive-modules`

Comando especial que limpia automáticamente todos los módulos que están inactivos en la configuración.

```bash
php artisan project:clean-inactive-modules [--force] [--dry-run] [--module=nombre]
```

**Opciones:**
- `--force`: Ejecutar sin confirmación
- `--dry-run`: Simular sin aplicar cambios
- `--module=nombre`: Limpiar solo un módulo específico (debe estar inactivo)

**Ejemplos:**

```bash
# Simular limpieza de todos los módulos inactivos
php artisan project:clean-inactive-modules --dry-run

# Limpiar todos los módulos inactivos con confirmación
php artisan project:clean-inactive-modules

# Limpiar todos los módulos inactivos sin confirmación
php artisan project:clean-inactive-modules --force

# Limpiar solo un módulo específico (si está inactivo)
php artisan project:clean-inactive-modules --module=blog
```

**Características:**
- ✅ Detecta automáticamente qué módulos están inactivos
- ✅ Solo limpia módulos que realmente están inactivos
- ✅ Procesa todos los módulos inactivos en una sola ejecución
- ✅ Muestra resumen final con estadísticas

**Ejemplo de salida:**

```
🧹 Limpieza de Módulos Inactivos

📋 Módulos inactivos detectados:
   - blog
   - gallery
   - projects
   - products
   - team
   - references
   - news

🔄 Limpiando módulo: blog
...
✅ Módulo 'blog' limpiado exitosamente

═══════════════════════════════════════════════════════════
📊 Resumen de Limpieza
═══════════════════════════════════════════════════════════
✅ Módulos limpiados exitosamente: 7
🎉 Todos los módulos inactivos han sido limpiados exitosamente.
```

---

## 📚 Referencias

- `app/Console/Commands/CleanModule.php` - Comando principal genérico
- `app/Console/Commands/CleanInactiveModules.php` - Comando para limpiar todos los módulos inactivos
- `app/Console/Commands/Clean*.php` - Comandos específicos por módulo
- `docs/BEST-PRACTICES-SEEDERS.md` - Mejores prácticas de seeders

---

**Última actualización:** Enero 2026  
**Versión:** 1.0.0
