import type { FastifyInstance } from "fastify";
import { z } from "zod";
import * as tpl from "../../repos/templates.js";
import { writeAudit } from "../../audit/audit.js";

/** Rotas de templates de mensagem. Nível operador (autenticado). */

const idParams = z.object({ id: z.coerce.number().int().positive() });
const triggerEnum = z.enum(["paid_new_customer_validation", "counterparty_selling_pix", "manual"]);

const createSchema = z.object({
  trigger_key: triggerEnum,
  title: z.string().min(1),
  body: z.string().min(1),
  enabled: z.boolean().optional(),
});

const updateSchema = z.object({
  trigger_key: triggerEnum.optional(),
  title: z.string().min(1).optional(),
  body: z.string().min(1).optional(),
  enabled: z.boolean().optional(),
});

export async function templateRoutes(app: FastifyInstance): Promise<void> {
  const auth = { preHandler: app.authenticate };

  app.get("/templates", auth, async () => tpl.list());

  app.post("/templates", auth, async (req, reply) => {
    const parsed = createSchema.safeParse(req.body);
    if (!parsed.success) return reply.code(400).send({ error: "Dados inválidos.", issues: parsed.error.issues });
    const id = await tpl.create(parsed.data);
    await writeAudit({ userId: req.user.sub, action: "template.create", entity: "template", entityId: id });
    return reply.code(201).send(await tpl.getById(id));
  });

  app.patch("/templates/:id", auth, async (req, reply) => {
    const { id } = idParams.parse(req.params);
    const parsed = updateSchema.safeParse(req.body);
    if (!parsed.success) return reply.code(400).send({ error: "Dados inválidos.", issues: parsed.error.issues });
    if (!(await tpl.getById(id))) return reply.code(404).send({ error: "Template não encontrado." });
    await tpl.update(id, parsed.data);
    await writeAudit({ userId: req.user.sub, action: "template.update", entity: "template", entityId: id });
    return tpl.getById(id);
  });

  app.delete("/templates/:id", auth, async (req, reply) => {
    const { id } = idParams.parse(req.params);
    await tpl.remove(id);
    await writeAudit({ userId: req.user.sub, action: "template.delete", entity: "template", entityId: id });
    return reply.code(204).send();
  });
}
