# Produccion: botones reales en Freshchat/WhatsApp

Esta integracion tiene dos capas:

1. FastAPI genera la logica conversacional y llama a Freshchat Conversation API.
2. La Custom App de Freshworks escucha eventos reales de Freshchat y reenvia esos eventos a FastAPI.

Advanced Automations API Library por si sola no renderiza botones desde un JSON externo. Solo guarda variables y permite mandar texto. Para botones/listas reales se necesita la Custom App o una accion nativa de Freshchat/Freddy.

## URL publica requerida

Usa HTTPS para la API publica:

```text
https://freshchat-api.macrobase.com.gt
```

No uses en produccion:

```text
http://129.80.4.9:8010
```

Freshworks puede rechazar apps o bloquear llamadas HTTP sin TLS.

## Variables .env recomendadas

```env
APP_NAME=MacroBase Freshchat API
APP_ENV=production
FRESHCHAT_API_TOKEN=<token-interno-para-freshworks-custom-app>
DEFAULT_RESPONSE_MODE=freshchat_simple

FRESHWORKS_API_BASE_URL=https://api.freshchat.com
FRESHWORKS_API_TOKEN=<api-key-oficial-freshchat>
FRESHWORKS_DEFAULT_ACTOR_TYPE=bot
FRESHWORKS_DEFAULT_ACTOR_ID=
FRESHWORKS_ASSUME_IDENTITY=false
EVENT_STORE_PATH=data/freshchat_events.db
```

## Caddy reverse proxy recomendado

Instala Caddy y apunta un DNS A hacia el servidor.

Ejemplo `/etc/caddy/Caddyfile`:

```caddyfile
freshchat-api.macrobase.com.gt {
    reverse_proxy 127.0.0.1:8010
}
```

Reinicia Caddy:

```bash
sudo systemctl reload caddy
```

Prueba:

```bash
curl https://freshchat-api.macrobase.com.gt/health
```

Debe responder:

```json
{"status":"ok"}
```

## Custom App

En Freshworks Developer Portal sube `freshworks_custom_app.zip`.

En la instalacion usa:

```text
MacroBase API Base URL:
https://freshchat-api.macrobase.com.gt

MacroBase API Token:
<mismo valor de FRESHCHAT_API_TOKEN>
```

La app escucha:

- `onAppInstall`: prueba conexion contra `/freshchat/events/install`.
- `onConversationCreate`: envia menu interactivo.
- `onMessageCreate`: procesa opciones seleccionadas.
- `onConversationUpdate`: apoyo para reaperturas/actualizaciones.

## Comportamiento final

- Si Freshchat acepta el payload interactivo, el cliente ve lista/botones.
- Si Freshchat rechaza el interactivo, la API envia fallback de texto automaticamente.
- Si el cliente escribe `1`, `2`, `3`, etc., la API tambien lo procesa para evitar bloquear la conversacion.

