# MangaReader - Documentación Técnica

Bienvenido a la documentación técnica de MangaReader. Este directorio contiene toda la información necesaria para entender, desarrollar y contribuir al proyecto.

## Documentos Disponibles

### [ARCHITECTURE.md](./ARCHITECTURE.md)
Documentación completa de la arquitectura del sistema.

**Contenido:**
- Visión general del sistema (Backend + iOS App)
- Arquitectura MVVM de la app iOS
- Diagramas de flujo de datos (scraping, lectura, guardado)
- Patrones de diseño implementados (Singleton, MVVM, Repository, etc.)
- Diagramas de secuencia en ASCII
- Decisiones arquitectónicas y su justificación

**Para quién es:**
- Desarrolladores que necesitan entender la estructura general
- Arquitectos que evalúan el diseño del sistema
- Nuevos contribuyentes que necesitan orientación

---

### [API.md](./API.md)
Documentación de la API y modelos de datos.

**Contenido:**
- Modelos de datos (Manga, Chapter, MangaPage, ReadingProgress, etc.)
- Documentación completa de servicios (ManhwaWebScraper, StorageService)
- Descripción de ViewModels y sus responsabilidades
- Errores y manejo de excepciones
- Ejemplos de uso para cada método público

**Para quién es:**
- Desarrolladores que integran funcionalidades
- Equipo QA que necesita entender comportamientos esperados
- Contribuyentes que agregan nuevas features

---

### [CONTRIBUTING.md](./CONTRIBUTING.md)
Guía para contribuir al proyecto.

**Contenido:**
- Configuración del entorno de desarrollo
- Cómo agregar nuevas fuentes de manga
- Cómo modificar el scraper existente
- Estándares de código (Swift style guide)
- Testing (unit tests, integración)
- Pull request guidelines
- Troubleshooting común

**Para quién es:**
- Nuevos contribuyentes
- Desarrolladores que agregan features
- Maintainers que revisan PRs

---

## Estructura del Proyecto

```
MangaReader/
├── docs/                       # Documentación técnica
│   ├── README.md              # Este archivo (índice)
│   ├── ARCHITECTURE.md        # Arquitectura y diagramas
│   ├── API.md                 # API y modelos de datos
│   └── CONTRIBUTING.md        # Guía para contribuyentes
│
├── ios-app/                   # Aplicación iOS
│   ├── MangaReaderApp.swift   # Entry point de la app
│   ├── Sources/
│   │   ├── Models/           # Modelos de datos
│   │   │   └── Manga.swift   # Models documentados
│   │   ├── Services/         # Lógica de negocio
│   │   │   ├── ManhwaWebScraper.swift  # Scraper documentado
│   │   │   └── StorageService.swift    # Storage documentado
│   │   └── Views/            # UI SwiftUI
│   │       ├── ContentView.swift
│   │       ├── MangaDetailView.swift
│   │       └── ReaderView.swift
│   └── MangaReader.xcodeproj
│
└── backend/                   # Backend opcional (Node.js)
    ├── scraper.js
    ├── server.js
    └── package.json
```

---

## Resumen Rápido de Componentes

### Modelos de Datos
- **Manga**: Información completa de un manga
- **Chapter**: Capítulo individual con estado de lectura
- **MangaPage**: Página individual (imagen)
- **ReadingProgress**: Progreso de lectura del usuario
- **DownloadedChapter**: Capítulo descargado localmente

### Servicios
- **ManhwaWebScraper**: Scraper usando WKWebView para manhwaweb.com
- **StorageService**: Gestión de almacenamiento local (UserDefaults + FileManager)

### ViewModels
- **MangaListViewModel**: Lista principal de mangas
- **MangaDetailViewModel**: Detalle de un manga
- **ReaderViewModel**: Lector de capítulos

### Views
- **ContentView**: Vista principal con lista de mangas
- **MangaDetailView**: Detalle y capítulos de un manga
- **ReaderView**: Lector de imágenes con zoom/pan

---

## Comenzar Rápidamente

### Para Entender la Arquitectura
1. Lee [ARCHITECTURE.md](./ARCHITECTURE.md) - Sección "Visión General"
2. Revisa los diagramas de flujo de datos
3. Estudia los patrones de diseño usados

### Para Usar la API
1. Consulta [API.md](./API.md) - Sección "Modelos de Datos"
2. Revisa los servicios disponibles
3. Mira los ejemplos de uso

### Para Contribuir
1. Lee [CONTRIBUTING.md](./CONTRIBUTING.md) - "Configuración del Entorno"
2. Configura tu entorno de desarrollo
3. Revisa los estándares de código
4. Sigue el workflow de Pull Requests

---

## Tecnologías Utilizadas

### iOS App
- **SwiftUI**: Framework de UI declarativo
- **Combine**: Programación reactiva
- **WKWebView**: Rendering de JavaScript
- **UserDefaults**: Almacenamiento de preferencias
- **FileManager**: Almacenamiento de archivos

### Backend (Opcional)
- **Node.js**: Runtime de JavaScript
- **Express**: Framework web
- **Puppeteer**: Headless Chrome automation

---

## Patrones de Diseño Principales

| Patrón | Implementación | Propósito |
|--------|---------------|-----------|
| **MVVM** | ViewModels separados de Views | Separar UI de lógica |
| **Singleton** | `StorageService.shared`, `ManhwaWebScraper.shared` | Instancia única compartida |
| **Repository** | `StorageService` abstrae UserDefaults/FileManager | Interfaz unificada de datos |
| **Async/Await** | Métodos `async throws` en scraper | Código asíncrono legible |
| **Observable** | `@Published`, `ObservableObject` | Reactividad en SwiftUI |

---

## Flujos Principales

### 1. Agregar Manga
```
Usuario → ContentView → MangaListViewModel
  ↓
ManhwaWebScraper.scrapeMangaInfo()
  ↓
WKWebView + JavaScript
  ↓
Manga actualizado en UI
```

### 2. Leer Capítulo
```
Usuario → MangaDetailView → ReaderView
  ↓
ReaderViewModel.loadPages()
  ↓
¿Descargado? ─NO→ ManhwaWebScraper.scrapeChapterImages()
  │S                      ↓
  └─→ StorageService.getDownloadedChapter()
  ↓
Mostrar páginas en ReaderView
```

### 3. Guardar Progreso
```
Usuario navega a página X
  ↓
ReaderViewModel.currentPage = X
  ↓
ReaderViewModel.saveProgress()
  ↓
StorageService.saveReadingProgress()
  ↓
UserDefaults (JSON codificado)
```

---

## Preguntas Frecuentes

**¿Puedo agregar nuevas fuentes de manga?**
Sí. Lee [CONTRIBUTING.md](./CONTRIBUTING.md) - Sección "Cómo Agregar Nuevas Fuentes de Manga".

**¿El backend es obligatorio?**
No. La app iOS funciona completamente de manera autónoma. El backend es opcional y puede servir como cache/API intermedia.

**¿Cómo cambio el scraper si manhwaweb.com cambia su estructura?**
Consulta [CONTRIBUTING.md](./CONTRIBUTING.md) - Sección "Cómo Modificar el Scraper".

**¿Cómo ejecuto los tests?**
Ve a [CONTRIBUTING.md](./CONTRIBUTING.md) - Sección "Testing".

---

## Convenciones de Documentación

### En Código Swift
- **///**: Comentarios de documentación públicos (soportan Markdown)
- **//:**: Comentarios de sección (MARK)
- **//**: Comentarios de implementación

### Ejemplo de Documentación de Método
```swift
/// Obtiene la lista de capítulos de un manga.
///
/// Este método carga la página del manga, espera a que JavaScript renderice
/// el contenido, y extrae todos los links de capítulos disponibles.
///
/// - Parameter mangaSlug: Slug único del manga
/// - Returns: Array de `Chapter` ordenados por número (descendente)
/// - Throws: `ScrapingError` si el WebView no está inicializado
///
/// # Example
/// ```swift
/// let chapters = try await scraper.scrapeChapters(mangaSlug: "one-piece")
/// ```
func scrapeChapters(mangaSlug: String) async throws -> [Chapter]
```

---

## Recursos Adicionales

### Documentación Oficial
- [Swift Language Guide](https://docs.swift.org/swift-book/)
- [SwiftUI Documentation](https://developer.apple.com/documentation/swiftui)
- [WKWebView Reference](https://developer.apple.com/documentation/webkit/wkwebview)

### Herramientas
- **SwiftLint**: Linter para código Swift
- **SwiftFormat**: Formateador automático
- **Jazzy**: Generador de documentación (Objective-C/Swift)

---

## Soporte y Contribución

¿Encontraste un error en la documentación? ¿Falta algo?

1. Abre un issue en el repositorio
2. O envía un Pull Request con las mejoras

Para más detalles sobre cómo contribuir, revisa [CONTRIBUTING.md](./CONTRIBUTING.md).

---

**Última actualización**: Febrero 2026
**Versión**: 1.0.0
**Mantenedor**: MangaReader Team
