# Guía de Instalación - MySQL 8.0

## Escuelas Deportivas Chile

**Motor de Base de Datos:** MySQL Community Server 8.0.45  
**Cliente:** libmysql - mysqlnd 8.4.16

---

## Índice

1. [Requisitos](#1-requisitos)
2. [Configuración de MySQL](#2-configuración-de-mysql)
3. [Configuración del Proyecto](#3-configuración-del-proyecto)
4. [Despliegue](#4-despliegue)
5. [Verificación](#5-verificación)
6. [Solución de Problemas](#6-solución-de-problemas)

---

## 1. Requisitos

### Software Requerido

| Componente | Versión Mínima | Recomendada |
|------------|----------------|-------------|
| MySQL Server | 8.0.x | 8.0.45 |
| Node.js | 18.x | 18.x LTS |
| Yarn | 1.22.x | 1.22.x |

### Verificar Versiones

```bash
# MySQL
mysql --version

# Node.js
node --version

# Yarn
yarn --version
```

---

## 2. Configuración de MySQL

### 2.1 Crear Base de Datos

Conectar a MySQL como administrador:

```bash
mysql -u root -p
```

Ejecutar el script de configuración:

```sql
-- Crear base de datos
CREATE DATABASE IF NOT EXISTS escuelas_deportivas
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- Verificar creación
SHOW DATABASES LIKE 'escuelas_deportivas';
```

### 2.2 Crear Usuario de Aplicación (Recomendado)

```sql
-- Crear usuario con autenticación nativa
CREATE USER 'escuelas_app'@'localhost' 
  IDENTIFIED WITH mysql_native_password BY 'TuPasswordSeguro123!';

-- Otorgar privilegios
GRANT ALL PRIVILEGES ON escuelas_deportivas.* TO 'escuelas_app'@'localhost';

-- Aplicar cambios
FLUSH PRIVILEGES;

-- Verificar
SHOW GRANTS FOR 'escuelas_app'@'localhost';
```

### 2.3 Configuración Recomendada de MySQL

Editar `my.cnf` (Linux) o `my.ini` (Windows):

```ini
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default_authentication_plugin = mysql_native_password
max_connections = 100
innodb_buffer_pool_size = 256M

[client]
default-character-set = utf8mb4
```

Reiniciar MySQL después de cambios:

```bash
# Linux
sudo systemctl restart mysql

# Windows
net stop mysql && net start mysql
```

---

## 3. Configuración del Proyecto

### 3.1 Clonar/Copiar Proyecto

```bash
# Navegar al directorio del proyecto
cd /ruta/a/escuelas_deportivas_chile/nextjs_space
```

### 3.2 Configurar Variables de Entorno

Crear archivo `.env` basado en el ejemplo:

```bash
cp .env.mysql.example .env
```

Editar `.env` con tus credenciales:

```env
# Base de datos MySQL
DATABASE_URL="mysql://escuelas_app:TuPasswordSeguro123!@localhost:3306/escuelas_deportivas"

# NextAuth.js
NEXTAUTH_URL="http://tudominio.com"
NEXTAUTH_SECRET="generar-con-openssl-rand-base64-32"
```

**⚠️ Importante:** Si tu contraseña tiene caracteres especiales:

| Carácter | Código URL |
|----------|------------|
| @ | %40 |
| # | %23 |
| ! | %21 |
| $ | %24 |
| & | %26 |
| = | %3D |

Ejemplo: `Mi@Pass#123` → `Mi%40Pass%23123`

### 3.3 Instalar Dependencias

```bash
yarn install
```

### 3.4 Generar Cliente Prisma

```bash
yarn prisma generate
```

### 3.5 Crear Tablas en la Base de Datos

```bash
yarn prisma db push
```

Salida esperada:
```
🚀  Your database is now in sync with your Prisma schema.
```

### 3.6 Cargar Datos Iniciales

```bash
yarn prisma db seed
```

Esto creará:
- Usuario administrador
- Provincias y comunas de Chile
- Catálogo de deportes

---

## 4. Despliegue

### 4.1 Modo Desarrollo

```bash
yarn dev
```

Acceder a: http://localhost:3000

### 4.2 Modo Producción

```bash
# Construir aplicación
yarn build

# Iniciar servidor
yarn start
```

### 4.3 Con PM2 (Recomendado para Producción)

```bash
# Instalar PM2
npm install -g pm2

# Iniciar aplicación
pm2 start yarn --name "escuelas-deportivas" -- start

# Ver estado
pm2 status

# Configurar inicio automático
pm2 startup
pm2 save
```

---

## 5. Verificación

### 5.1 Verificar Conexión a Base de Datos

```bash
yarn prisma db pull
```

Si no hay errores, la conexión es exitosa.

### 5.2 Verificar Tablas Creadas

```sql
USE escuelas_deportivas;
SHOW TABLES;
```

Deberías ver aprox. 20 tablas:
- Account, Session, User, VerificationToken
- Deporte, Provincia, Comuna
- Escuela, Sede, EscuelaDeporte
- Instructor, UbicacionInstructor, InstructorDeporte
- Actividad, Inscripcion
- Album, Foto
- ContenidoSitio, ConfiguracionSitio
- _prisma_migrations

### 5.3 Verificar Datos Seed

```sql
-- Verificar usuario admin
SELECT id, email, name, rol FROM User;

-- Verificar deportes
SELECT nombre, categorias FROM Deporte;

-- Verificar provincias
SELECT p.nombre, COUNT(c.id) as comunas 
FROM Provincia p 
LEFT JOIN Comuna c ON c.provinciaId = p.id 
GROUP BY p.id;
```

### 5.4 Acceder al Sistema

1. Abrir navegador: http://localhost:3000
2. Ir a Admin: http://localhost:3000/admin/login
3. Credenciales:
   - Email: `admin@escuelasdeportivas.cl`
   - Password: `admin123`

---

## 6. Solución de Problemas

### Error: "Access denied for user"

```bash
# Verificar credenciales
mysql -u escuelas_app -p -e "SELECT 1"

# Recrear usuario si es necesario
mysql -u root -p
DROP USER 'escuelas_app'@'localhost';
-- Crear nuevamente según sección 2.2
```

### Error: "Unknown database 'escuelas_deportivas'"

```sql
-- Crear base de datos
CREATE DATABASE escuelas_deportivas 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;
```

### Error: "Can't connect to MySQL server"

```bash
# Verificar que MySQL esté corriendo
sudo systemctl status mysql

# Iniciar si está detenido
sudo systemctl start mysql
```

### Error: "Client does not support authentication protocol"

```sql
-- Cambiar método de autenticación
ALTER USER 'escuelas_app'@'localhost' 
  IDENTIFIED WITH mysql_native_password BY 'TuPassword';
FLUSH PRIVILEGES;
```

### Error: Prisma "P1001 - Can't reach database server"

Verificar:
1. MySQL está corriendo
2. Puerto 3306 está abierto
3. Firewall permite conexiones
4. DATABASE_URL está correcta en .env

### Error: "Incorrect string value" (caracteres especiales)

```sql
-- Verificar charset de tablas
SELECT TABLE_NAME, TABLE_COLLATION 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'escuelas_deportivas';

-- Convertir si es necesario
ALTER DATABASE escuelas_deportivas 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;
```

---

## Comandos Útiles

### Prisma

```bash
# Ver estado de migraciones
yarn prisma migrate status

# Abrir Prisma Studio (GUI)
yarn prisma studio

# Resetear base de datos (CUIDADO: borra todos los datos)
yarn prisma migrate reset

# Generar cliente después de cambios en schema
yarn prisma generate
```

### MySQL

```bash
# Backup de base de datos
mysqldump -u root -p escuelas_deportivas > backup.sql

# Restaurar backup
mysql -u root -p escuelas_deportivas < backup.sql

# Ver tamaño de base de datos
mysql -u root -p -e "SELECT table_schema, ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' FROM information_schema.tables WHERE table_schema = 'escuelas_deportivas' GROUP BY table_schema;"
```

---

## Estructura de la Base de Datos

### Diagrama de Relaciones Principales

```
User (Autenticación)
  └── Account, Session

Deporte
  ├── EscuelaDeporte ── Escuela ── Sede
  ├── InstructorDeporte ── Instructor ── UbicacionInstructor
  └── Actividad ── Inscripcion

Provincia
  └── Comuna
       ├── Sede
       ├── Instructor
       └── Inscripcion
```

### Campos JSON (Arrays almacenados como JSON)

| Modelo | Campo | Ejemplo |
|--------|-------|--------|
| Deporte | categorias | ["Fútbol 11", "Futsal", "Fútbol 7"] |
| Escuela | certificaciones | ["IND Chile", "MINEDUC"] |
| Instructor | certificaciones | ["Licencia ANFP", "Título DT"] |
| Instructor | especialidades | ["Arqueros", "Táctica"] |
| Actividad | diasSemana | ["Lunes", "Miércoles", "Viernes"] |
| Inscripcion | diasPreferidos | ["Sábado", "Domingo"] |

---

## Soporte

Para problemas técnicos:
1. Revisar logs: `pm2 logs escuelas-deportivas`
2. Verificar conexión MySQL
3. Consultar documentación de Prisma: https://www.prisma.io/docs

**Credenciales por defecto:**
- Admin: admin@escuelasdeportivas.cl / admin123

⚠️ **Cambiar contraseña inmediatamente en producción**
