# XamiLib PHP — Referencia de clases

Namespace: `Xami\SDK`. El punto de entrada es la clase `XamiSDK`, que da acceso a los
distintos servicios.

---

## `XamiSDK`

Punto de entrada de la librería.

### Constructor

```php
new XamiSDK(array $config)
```

`$config` acepta:

| Clave | Descripción |
|---|---|
| `endpoint` | URL del servicio local (por defecto `http://127.0.0.1:8300`). |
| `wrapper_key` | Credencial de aplicación (`wrp_...`). |
| `wrapper_secret` | Secret de la credencial (`wsec_...`). |
| `timeout` | Timeout HTTP en segundos (opcional). |

### Métodos

| Método | Devuelve | Descripción |
|---|---|---|
| `pades()` | `Pades` | Servicio de firma de documentos PDF. |
| `blockchain()` | `Blockchain` | Servicio de firma de transacciones EVM. |
| `credentials()` | `Credentials` | Consulta de credenciales. |
| `designs()` | `Designs` | Consulta de diseños de sello. |
| `health()` | `Health` | Estado del servicio local. |

---

## `Pades`

Firma de documentos PDF (PAdES).

### Métodos

#### `sign(string $pdfBytes, array $opts): string`
Envía un PDF a firmar. Devuelve el `request_id`. `$opts`: `credential_key` (requerido),
`design_key`, `variables`, `reason`, `location`, `signer_name`.

#### `result(string $requestId): array`
Consulta el estado. Cuando está `DONE`, incluye el PDF firmado.

#### `wait(string $requestId, int $timeoutSeconds = 60, float $pollSeconds = 1.0): string`
Bloquea hasta que la firma esté lista y devuelve el PDF firmado (binario).

#### `signAndWait(string $pdfBytes, array $opts, int $timeoutSeconds = 60): string`
Atajo: `sign()` + `wait()`. Devuelve el PDF firmado.

### Ejemplo

```php
$pdfFirmado = $xami->pades()->signAndWait(
    file_get_contents('documento.pdf'),
    [
        'credential_key' => 'TU_CREDENCIAL',
        'signer_name'    => 'Tu Nombre',
        'reason'         => 'Aprobación',
        'variables'      => ['name' => 'Tu Nombre'],
    ]
);
file_put_contents('documento_firmado.pdf', $pdfFirmado);
```

---

## `Blockchain`

Firma de transacciones / mensajes EVM. El chip actúa como wallet y devuelve `r`/`s`/`v`;
tú ensamblas la transacción con tu web3.

### Métodos

#### `sign(string $txHash, array $opts): string`
Envía el hash a firmar. Devuelve el `request_id`. `$opts`: `credential_key` (requerido,
credencial EVM), `chain_id`.

#### `result(string $requestId): array`
Consulta el estado.

#### `wait(string $requestId, int $timeoutSeconds = 60, float $pollSeconds = 1.0): array`
Bloquea hasta tener la firma. Devuelve `['r' => ..., 's' => ..., 'v' => ...]`.

#### `signAndWait(string $txHash, array $opts, int $timeoutSeconds = 60): array`
Atajo: `sign()` + `wait()`.

### Ejemplo

```php
$firma = $xami->blockchain()->signAndWait('0xHASH_DE_LA_TX', [
    'credential_key' => 'TU_CREDENCIAL_EVM',
    'chain_id'       => 648541,
]);
// $firma['r'], $firma['s'], $firma['v']
```

---

## `Credentials`

Consulta de credenciales en la caché local.

| Método | Devuelve | Descripción |
|---|---|---|
| `all(): array` | lista | Todas las credenciales disponibles. |
| `get(string $key): ?array` | credencial o `null` | Una credencial por su `credential_key`. |

---

## `Designs`

Consulta de diseños de sello en la caché local.

| Método | Devuelve | Descripción |
|---|---|---|
| `all(): array` | lista | Todos los diseños disponibles. |
| `get(string $key): ?array` | diseño o `null` | Un diseño por su `design_key`. |

---

## `Health`

| Método | Devuelve | Descripción |
|---|---|---|
| `self(): array` | estado | Estado del servicio local (pareado, tenant, etc.). |

---

## Manejo de errores

Todos los métodos lanzan `Xami\SDK\XamiException` ante un fallo (credencial inválida,
servicio caído, timeout). Envuélvelos en `try/catch`.

```php
use Xami\SDK\XamiException;

try {
    $pdf = $xami->pades()->signAndWait($bytes, ['credential_key' => '...']);
} catch (XamiException $e) {
    error_log('Error al firmar: ' . $e->getMessage());
}
```
