import type { FastifyInstance } from 'fastify';
import { authenticate, requireRole } from '../middleware/auth.js';
import { knowledgeModuleService } from '../services/knowledgeModuleService.js';
import { auditService } from '../services/auditService.js';

const staff = [authenticate, requireRole('admin', 'user')];

export async function knowledgeModuleRoutes(fastify: FastifyInstance) {
  fastify.get('/', { preHandler: staff }, async (_req, reply) => {
    return reply.send(await knowledgeModuleService.list());
  });

  fastify.post('/', { preHandler: staff }, async (req, reply) => {
    const body = req.body as {
      slug?: string;
      title?: string;
      group_label?: string | null;
      body_markdown?: string;
      sort_order?: number;
    };
    if (!body?.title?.trim()) return reply.status(400).send({ error: 'title is required' });
    const m = await knowledgeModuleService.create({
      slug: body.slug,
      title: body.title.trim(),
      group_label: body.group_label,
      body_markdown: body.body_markdown,
      sort_order: body.sort_order,
    });
    await auditService.log(req.user!.sub, 'user', 'knowledge_module.created', 'knowledge_module', m.id, {
      slug: m.slug,
    });
    return reply.status(201).send(m);
  });

  fastify.get('/:id', { preHandler: staff }, async (req, reply) => {
    const { id } = req.params as { id: string };
    const m = await knowledgeModuleService.getById(id);
    if (!m) return reply.status(404).send({ error: 'Module not found' });
    return reply.send(m);
  });

  fastify.patch('/:id', { preHandler: staff }, async (req, reply) => {
    const { id } = req.params as { id: string };
    const body = req.body as Partial<{
      slug: string;
      title: string;
      group_label: string | null;
      body_markdown: string;
      sort_order: number;
    }>;
    const m = await knowledgeModuleService.update(id, body);
    if (!m) return reply.status(404).send({ error: 'Module not found' });
    await auditService.log(req.user!.sub, 'user', 'knowledge_module.updated', 'knowledge_module', id, body);
    return reply.send(m);
  });

  fastify.delete('/:id', { preHandler: staff }, async (req, reply) => {
    const { id } = req.params as { id: string };
    const ok = await knowledgeModuleService.delete(id);
    if (!ok) return reply.status(404).send({ error: 'Module not found' });
    await auditService.log(req.user!.sub, 'user', 'knowledge_module.deleted', 'knowledge_module', id, {});
    return reply.status(204).send();
  });
}
