## Task 6: Endpoint stato/download/trigger

**Files:**
- Create: `app/src/routes/api/dvr/[id]/pdf/+server.ts`

**Interfaces:**
- Consumes: `getPdfStatus`, `markGenerating` (Task 3), `triggerPdfGeneration` (Task 5), `getObject` da `$lib/server/r2`.
- Produces:
  - `GET ?mode=status` → `200 { state, generatoIl }`
  - `GET` (default, download) → se `ready`: stream del PDF da R2 con `Content-Disposition: attachment; filename="{codice}_DVR.pdf"`; altrimenti `409 { state }`. Se `state==='stale'` ma esiste un `r2_key` precedente, consente comunque il download della versione precedente con `?allowStale=1`.
  - `POST` → se non già `generating`: `markGenerating` + `triggerPdfGeneration`; ritorna `202 { state: 'generating' }`.

- [ ] **Step 1: Implementa l'endpoint**

```ts
import { error, json } from '@sveltejs/kit';
import { db } from '$lib/server/db';
import { agenzie, dvrPdf } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
import { getPdfStatus, markGenerating } from '$lib/server/pdf/state';
import { triggerPdfGeneration } from '$lib/server/pdf/dispatch';
import { getObject } from '$lib/server/r2';

export const GET = async ({ params, url }) => {
	const id = parseInt(params.id, 10);
	if (Number.isNaN(id)) throw error(400, 'ID non valido');
	const status = await getPdfStatus(id);
	if (url.searchParams.get('mode') === 'status') {
		return json({ state: status.state, generatoIl: status.generatoIl });
	}
	// download
	const canServe = status.state === 'ready' || (url.searchParams.get('allowStale') === '1' && status.r2Key);
	if (!canServe || !status.r2Key) return json({ state: status.state }, { status: 409 });
	const [a] = await db.select({ codice: agenzie.codiceFisico }).from(agenzie).where(eq(agenzie.id, id));
	const obj = await getObject(status.r2Key);
	if (!obj) return json({ state: 'missing' }, { status: 409 });
	return new Response(obj.body, {
		headers: {
			'Content-Type': 'application/pdf',
			'Content-Disposition': `attachment; filename="${a?.codice ?? 'dvr'}_DVR.pdf"`
		}
	});
};

export const POST = async ({ params }) => {
	const id = parseInt(params.id, 10);
	if (Number.isNaN(id)) throw error(400, 'ID non valido');
	const status = await getPdfStatus(id);
	if (status.state === 'generating') return json({ state: 'generating' }, { status: 202 });
	await markGenerating(id, status.currentHash);
	await triggerPdfGeneration(id);
	return json({ state: 'generating' }, { status: 202 });
};
```

> Adatta la lettura del corpo da `getObject` alla forma effettiva del suo ritorno (vedi `app/src/lib/server/r2.ts` e l'uso in `routes/api/allegati/[id]/+server.ts`): riusa lo stesso pattern di streaming già presente lì.

- [ ] **Step 2: Type-check**

Run: `cd app && npm run check`
Expected: 0 errori.

- [ ] **Step 3: Verifica manuale (dev server, dato locale)**

```bash
cd app && npm run dev
```
Con un'agenzia che ha già un PDF in R2 (dopo Task 4 Step 6): `GET /api/dvr/467/pdf?mode=status` → `{ state: 'ready' | 'stale' }`. `GET /api/dvr/467/pdf` → scarica il PDF. Per una gemella (es. 806) lo stato deve riflettere il DVR della compagna.

- [ ] **Step 4: Commit**

```bash
git add "app/src/routes/api/dvr/[id]/pdf/+server.ts"
git commit -m "PDF: endpoint stato/download/trigger"
```

---

