# Arquitectura DB-Based - Configuración del Proyecto

## 🎯 Objetivo

**Separar completamente los datos del proyecto del código base**, almacenando la configuración específica del proyecto en la **base de datos** en lugar de en archivos de configuración.

## ✅ Ventajas

### 1. **Propagación de Actualizaciones Sin Conflictos**
- ✅ Actualizar código base → No afecta datos del proyecto
- ✅ `config/site.php` puede cambiar → Los datos del proyecto permanecen en DB
- ✅ Git pull/merge → Sin conflictos con datos del proyecto

### 2. **Multi-Tenant Real**
- ✅ Cada proyecto con su propia DB
- ✅ Datos completamente aislados
- ✅ Cambiar DB = Cambiar todo el proyecto

### 3. **Mantenibilidad**
- ✅ Datos del proyecto en un solo lugar (DB)
- ✅ Fácil backup/restore de datos del proyecto
- ✅ Versionado independiente (DB vs código)

## 🏗️ Arquitectura

```
┌─────────────────────────────────────────┐
│         BASE DE DATOS                   │
│      (Una DB por proyecto)             │
│                                         │
│  Tabla: settings                       │
│  Keys: site.contact, site.social_media │
│  Values: JSON o strings                 │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│      SiteConfigService                  │
│  (Carga desde DB con cache)            │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│   SiteConfigServiceProvider             │
│  (Merge DB + config/site.php)          │
│  DB tiene prioridad                    │
└─────────────────────────────────────────┘
              ↓
┌─────────────────────────────────────────┐
│      config('site.*')                   │
│  (Valores finales para la app)         │
└─────────────────────────────────────────┘
```

## 📊 Flujo de Datos

### 1. Seeders Cargar Datos

```php
// SiteDataSeeder carga desde JSON
$data = json_decode(file_get_contents('site-data.json'), true);

// Guarda en DB usando SiteConfigService
SiteConfigService::setMany([
    'contact' => $data['contact'],
    'social_media' => $data['social_media'],
    'footer' => $data['footer'],
    'development' => $data['development'],
], 1);
```

### 2. Service Provider Merge

```php
// SiteConfigServiceProvider::boot()
$fileConfig = config('site', []);           // Desde config/site.php
$dbConfig = SiteConfigService::getSiteConfigFromDb(); // Desde DB
$mergedConfig = array_replace_recursive($fileConfig, $dbConfig); // DB tiene prioridad
Config::set('site', $mergedConfig);
```

### 3. Aplicación Usa Config

```php
// En cualquier parte de la app
$contact = config('site.contact');  // Valor desde DB (si existe) o desde config/site.php
$gaId = config('site.google_analytics.tracking_id'); // Desde DB
```

## 🔧 Componentes

### SiteConfigService

**Ubicación:** `app/Services/SiteConfigService.php`

**Funciones:**
- `getSiteConfigFromDb()` - Carga configuración desde DB (con cache)
- `set($key, $value)` - Guarda un valor
- `setMany($config)` - Guarda múltiples valores
- `mergeWithFileConfig($fileConfig)` - Merge DB + archivo
- `clearCache()` - Limpia cache

**Cache:**
- Key: `site_config_db`
- Duración: 24 horas
- Se limpia automáticamente al guardar nuevos valores

### SiteConfigServiceProvider

**Ubicación:** `app/Providers/SiteConfigServiceProvider.php`

**Función:**
- En `boot()`, merge configuración de DB con `config/site.php`
- Los valores de la DB tienen prioridad sobre los del archivo

**Registrado en:** `config/app.php`

### Seeders Modificados

**SiteDataSeeder:**
- Antes: Modificaba `config/site.php` directamente
- Ahora: Guarda en DB usando `SiteConfigService::setMany()`

**AnalyticsSeeder:**
- Antes: Modificaba `config/site.php` directamente
- Ahora: Guarda en DB usando `SiteConfigService::set()`

## 📋 Estructura en DB

### Tabla: `settings`

| id | key | value | user_id |
|----|-----|-------|---------|
| 1 | `site.contact.phone` | `+1 (305) 555-1234` | 1 |
| 2 | `site.contact.email` | `hello@muma.com` | 1 |
| 3 | `site.social_media.instagram` | `{"url":"...","active":true}` | 1 |
| 4 | `site.google_analytics` | `{"enabled":true,"tracking_id":"G-..."}` | 1 |

**Notas:**
- Keys con prefijo `site.` para identificar configuración del sitio
- Arrays se guardan como JSON
- Strings simples se guardan directamente

## 🔄 Flujo Completo

### Cargar Proyecto (Muma)

```bash
# 1. Cambiar DB
DB_DATABASE=muma_db

# 2. Ejecutar seeders
php artisan migrate:fresh --seed

# 3. Seeders cargan JSONs y guardan en DB
SiteDataSeeder → site-data.json → DB (settings)
AnalyticsSeeder → analytics.json → DB (settings)

# 4. Service Provider merge DB + config/site.php
SiteConfigServiceProvider → config('site') actualizado

# 5. App usa config('site.*')
```

### Actualizar Código Base

```bash
# 1. Git pull (actualiza código)
git pull origin main

# 2. Los datos del proyecto permanecen en DB
# 3. config/site.php puede cambiar (valores por defecto)
# 4. Service Provider merge automáticamente
# 5. Todo funciona sin conflictos
```

## 📝 Datos que van a DB

### ✅ Van a DB (Específicos del Proyecto)
- `contact` (phone, email, address, hours)
- `description`
- `social_media` (URLs, active)
- `footer` (navegación)
- `development` (coming soon mode)
- `google_analytics` (tracking_id, enabled)

### ❌ Permanecen en config/site.php (Estructura/Defaults)
- `name`, `tagline`, `url`, `author` (valores base)
- `theme` (estructura)
- `seo` (estructura, valores base)
- `og` (estructura, valores base)
- `twitter` (estructura, valores base)
- `assets` (rutas base)

## 🚀 Comandos Útiles

### Ver configuración desde DB
```php
php artisan tinker
>>> \App\Services\SiteConfigService::getSiteConfigFromDb();
```

### Guardar configuración manualmente
```php
php artisan tinker
>>> \App\Services\SiteConfigService::set('contact.phone', '+1 (305) 555-1234');
```

### Limpiar cache
```php
php artisan tinker
>>> \App\Services\SiteConfigService::clearCache();
```

## ⚠️ Notas Importantes

1. **Cache:** Los valores se cachean por 24 horas. Si cambias algo en la DB, limpia el cache o espera 24 horas.

2. **Prioridad:** Los valores de la DB tienen prioridad sobre los de `config/site.php`.

3. **JSON:** Los arrays se guardan como JSON en la DB. `SiteConfigService` los decodifica automáticamente.

4. **Fallback:** Si la tabla `settings` no existe o hay error, se usa solo `config/site.php`.

5. **Seeders:** Siempre ejecutar seeders después de cambiar DB para cargar datos del proyecto.

## 📚 Referencias

- `app/Services/SiteConfigService.php` - Servicio principal
- `app/Providers/SiteConfigServiceProvider.php` - Service Provider
- `database/seeders/SiteDataSeeder.php` - Seeder modificado
- `database/seeders/AnalyticsSeeder.php` - Seeder modificado
