import { logActivity } from "./activity";
import { prisma } from "./prisma";

export async function runCardMovedAutomations(
  cardId: string,
  boardId: string,
  toListId: string,
  actorId: string
) {
  const automations = await prisma.automation.findMany({
    where: { boardId, isEnabled: true, triggerType: "card.moved_to_list" },
  });

  for (const automation of automations) {
    const triggerConfig = automation.triggerConfig as { listId?: string };
    if (triggerConfig.listId !== toListId) continue;

    const actionConfig = automation.actionConfig as Record<string, unknown>;

    switch (automation.actionType) {
      case "card.archive":
        await prisma.card.update({ where: { id: cardId }, data: { isArchived: true } });
        break;
      case "card.move_to_list":
        if (typeof actionConfig.listId === "string") {
          await prisma.card.update({ where: { id: cardId }, data: { listId: actionConfig.listId } });
        }
        break;
      case "card.set_status":
        if (typeof actionConfig.statusOptionId === "string") {
          await prisma.card.update({
            where: { id: cardId },
            data: { statusOptionId: actionConfig.statusOptionId },
          });
        }
        break;
      case "card.add_label":
        if (typeof actionConfig.labelId === "string") {
          await prisma.cardLabel.upsert({
            where: { cardId_labelId: { cardId, labelId: actionConfig.labelId as string } },
            update: {},
            create: { cardId, labelId: actionConfig.labelId as string },
          });
        }
        break;
      default:
        continue;
    }

    await logActivity({
      boardId,
      cardId,
      actorId,
      action: "automation.ran",
      metadata: { automationId: automation.id, name: automation.name },
    });
  }
}
