# Arquitectura

## Visión General

```
┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│  Cliente    │────▶│  API REST   │────▶│   AEAT     │
│  (App)     │     │  (this)    │     │ VeriFactu  │
└─────────────┘     └──────────────┘     └─────────────┘
```

## Capas

### 1. API Layer (`api/`)
- **handler.go**: Handlers HTTP para endpoints
- **router.go**: Registro de rutas

### 2. Business Logic (`internal/`)
- **factura.go**: Servicio de facturas (alta, anulación)
- **formats/**: Sistema de formatos de entrada con detección automática
  - **registry.go**: Registro y auto-detección de formatos
  - **native/**: Formato nativo de la API
  - **dolibarr/**: Formato compatible con Dolibarr BFF
- **transformer.go**: Transformación JSON → datos de factura
- **hash.go**: Cálculo de hash encadenado
- **models.go**: Modelos y validación de entrada
- **config/**: Carga de configuración
- **cert/**: Gestión de certificados
- **crypto/**: Criptografía RSA

### 3. External Communication (`verifactu/`)
- **client.go**: Cliente SOAP para AEAT
- **soap.go**: Construcción de mensajes SOAP
- **xml.go**: Generación XML VeriFactu

## Flujo de Datos

```
Request HTTP
    │
    ▼
JSON Input
    │
    ▼
TransformAuto() ──▶ Detecta formato (native, dolibarr, ...)
    │
    ▼
Transformer.Transform() ──▶ TransformResult
    │
    ▼
CalculateHash(prevHash)
    │
    ▼
BuildSOAPRequest()
    │
    ▼
SendToAEAT()
    │
    ▼
Response
```

## Cifrado de Contraseñas

El cliente envía la contraseña del certificado cifrada con la clave pública RSA de la API:

```
1. GET /api/v1/auth/public-key → Obtener clave pública
2. RSA encrypt(password) → Cifrar contraseña
3. POST /api/v1/auth/register → Registrar cert con password cifrada
```

## Tokens

Al registrar un certificado se genera un token que identifica la sesión:

```json
{
  "success": true,
  "cert": {...},
  "token": "A1B2C3D4E5F6..."
}
```

Este token se usa en requests de facturas para identificar el certificado a usar.