# Modal de Geolocalización — demo-supplements-shop

Feature que muestra un popup al visitante cuando entra al catálogo de productos.
Permite redirigir a compradores de otras provincias hacia la tienda online (TiendaNube u otra URL),
y dejar pasar a los compradores locales.

---

## Cómo funciona

1. El visitante entra a `/products-catalogue` (o cualquier ruta que cargue `catalogue.blade.php`).
2. El JS del modal revisa `localStorage('geo_choice')`.
   - Si ya existe → **no muestra nada**. La elección persiste entre recargas (F5) y visitas.
   - Si no existe → muestra el modal Bootstrap.
3. El visitante elige:
   - **"Sí, soy de Tucumán"** → guarda `geo_choice = 'local'` en localStorage y cierra el modal.
   - **"No, soy de otra provincia"** → guarda `geo_choice = 'redirected'` y redirige a la URL configurada.
4. En modo **API**: ip-api.com detecta la provincia por IP y pre-selecciona el dropdown. El visitante puede corregirlo.

### Resetear el modal para testing

Desde la consola del browser:
```js
localStorage.removeItem('geo_choice')
```
Luego recargar la página.

---

## Configuración desde el panel admin

**Ruta:** `/products-settings` → tab **Geolocalización**

| Campo | Descripción |
|---|---|
| Activar modal | Toggle on/off. Si está off, el modal nunca aparece. |
| Modo | `simple` (Sí/No) o `api` (detección por IP + selector). |
| Provincia local | La provincia que puede seguir comprando. Default: `Tucumán`. |
| URL de redirección | A dónde va el visitante si elige otra provincia. Dejar vacío = solo cierra el modal. |

Los valores se guardan en la tabla `settings` con prefijo `site.products.geo_restriction.*` y se vuelven disponibles como `config('site.products.geo_restriction.*')` en todo el sistema.

---

## Modos disponibles

### `simple` (recomendado)

Sin llamada a API externa. Pregunta directa, dos botones:

```
📍 ¿Sos de Tucumán?

[ Sí, soy de Tucumán ]         ← guarda 'local', cierra modal
[ No, soy de otra provincia ]  ← guarda 'redirected', redirige a la URL configurada
```

### `api`

Llama a `https://ip-api.com/json/?fields=status,regionName&lang=es` (CORS libre, sin key, free tier).
Muestra un spinner mientras detecta, luego pre-selecciona la provincia en un dropdown.
El visitante puede corregirlo antes de confirmar.

---

## Archivos involucrados

| Archivo | Rol |
|---|---|
| `resources/views/modules/products/frontend/demos/demo-supplements-shop/partials/geo-modal.blade.php` | Partial con el HTML del modal + JS inline |
| `resources/views/modules/products/frontend/demos/demo-supplements-shop/catalogue.blade.php` | Incluye el partial con `@include(...)` antes del `@endsection` |
| `resources/views/modules/products/admin/manager.blade.php` | Tab "Geolocalización" con el form de configuración + preview |
| `app/Modules/Products/Controllers/Admin/ProductController.php` | Método `updateGeoRestriction()` que valida y guarda via `SiteConfigService` + lee config en `manager()` |
| `routes/modules/product.php` | Ruta `POST /products-settings/geo-restriction` → `products-settings.geo_restriction` |

---

## Settings en base de datos

Tabla `settings`, keys almacenadas:

```
site.products.geo_restriction.enabled        → '0' o '1'
site.products.geo_restriction.mode           → 'simple' o 'api'
site.products.geo_restriction.local_province → 'Tucumán' (u otra provincia)
site.products.geo_restriction.redirect_url   → 'https://...' o ''
```

Leídos automáticamente por `SiteConfigServiceProvider` en cada request y disponibles como:

```php
config('site.products.geo_restriction.enabled')
config('site.products.geo_restriction.mode')
config('site.products.geo_restriction.local_province')
config('site.products.geo_restriction.redirect_url')
```

---

## JS — localStorage

Clave usada: `geo_choice`  
Valores posibles: `'local'` | `'redirected'`

El modal solo se muestra si la clave **no existe** en localStorage.
Persiste entre F5, nuevas pestañas y visitas futuras en el mismo browser.

Si en el futuro se necesita que el cart o cualquier otra vista tome decisiones según la ubicación elegida:

```js
const choice = localStorage.getItem('geo_choice');
// 'local'      → el visitante eligió su provincia local
// 'redirected' → el visitante eligió otra provincia (pero no fue redirigido, p.ej. no hay redirect_url)
// null         → aún no eligió (no debería llegar acá si el modal está activo)
```

---

## Flujo resumido

```
Visitante entra a /products-catalogue
        │
        ├─ localStorage('geo_choice') existe? → No muestra modal
        │
        └─ No existe → muestra modal
                │
                ├─ modo 'simple'
                │     ├─ "Sí, soy de Tucumán"  → localStorage = 'local'  → cierra
                │     └─ "No, otra provincia"   → localStorage = 'redirected' → redirect URL
                │
                └─ modo 'api'
                      ├─ fetch ip-api.com → pre-selecciona provincia en dropdown
                      ├─ Si provincia local seleccionada  → botón "Seguir comprando" activo
                      └─ Si otra provincia                → botón "Ver tienda online" activo
```

---

## Para extender a otros demos

El partial `geo-modal.blade.php` es específico de `demo-supplements-shop`.
Para usarlo en otro demo, copiar el partial a la carpeta `partials/` del demo correspondiente
e incluirlo en su `catalogue.blade.php`. La configuración del admin es global (misma tabla `settings`).
