import { Router } from "express";
import { z } from "zod";
import { requireBoardAccess } from "../lib/authz";
import { prisma } from "../lib/prisma";
import { HttpError } from "../middleware/errorHandler";
import { requireAuth } from "../middleware/requireAuth";

export const automationsRouter = Router();
automationsRouter.use(requireAuth);

const createAutomationSchema = z.object({
  boardId: z.string().min(1),
  name: z.string().min(1).max(100),
  triggerType: z.literal("card.moved_to_list"),
  triggerConfig: z.object({ listId: z.string().min(1) }),
  actionType: z.enum(["card.archive", "card.move_to_list", "card.set_status", "card.add_label"]),
  actionConfig: z.record(z.string(), z.string()).default({}),
});

automationsRouter.get("/", async (req, res, next) => {
  try {
    const boardId = req.query.boardId as string;
    if (!boardId) throw new HttpError(400, "boardId is required");
    await requireBoardAccess(req.userId!, boardId, "VIEWER");

    const automations = await prisma.automation.findMany({ where: { boardId } });
    res.json({ automations });
  } catch (err) {
    next(err);
  }
});

automationsRouter.post("/", async (req, res, next) => {
  try {
    const data = createAutomationSchema.parse(req.body);
    await requireBoardAccess(req.userId!, data.boardId, "ADMIN");

    const automation = await prisma.automation.create({ data });
    res.status(201).json({ automation });
  } catch (err) {
    next(err);
  }
});

const updateAutomationSchema = z.object({
  name: z.string().min(1).max(100).optional(),
  isEnabled: z.boolean().optional(),
});

automationsRouter.patch("/:id", async (req, res, next) => {
  try {
    const automation = await prisma.automation.findUnique({ where: { id: req.params.id } });
    if (!automation) throw new HttpError(404, "Automation not found");
    await requireBoardAccess(req.userId!, automation.boardId, "ADMIN");

    const data = updateAutomationSchema.parse(req.body);
    const updated = await prisma.automation.update({ where: { id: req.params.id }, data });
    res.json({ automation: updated });
  } catch (err) {
    next(err);
  }
});

automationsRouter.delete("/:id", async (req, res, next) => {
  try {
    const automation = await prisma.automation.findUnique({ where: { id: req.params.id } });
    if (!automation) throw new HttpError(404, "Automation not found");
    await requireBoardAccess(req.userId!, automation.boardId, "ADMIN");

    await prisma.automation.delete({ where: { id: req.params.id } });
    res.status(204).send();
  } catch (err) {
    next(err);
  }
});
