import { getToken } from "next-auth/jwt";
import prisma from "src/lib/prismadb";

/**
 * Stores the task interaction with the Task Backend and then returns the next task generated.
 *
 * This implicity does a few things:
 * 1) Stores the answer with the Task Backend.
 * 2) Records the new task in our local database.
 * 3) Returns the newly created task to the client.
 */
const handler = async (req, res) => {
  const token = await getToken({ req });

  // Return nothing if the user isn't registered.
  if (!token) {
    res.status(401).end();
    return;
  }

  // Parse out the local task ID and the interaction contents.
  const { id, content, update_type } = await JSON.parse(req.body);

  // Log the interaction locally to create our user_post_id needed by the Task
  // Backend.
  const interaction = await prisma.taskInteraction.create({
    data: {
      content,
      task: {
        connect: {
          id,
        },
      },
    },
  });

  // Send the interaction to the Task Backend.  This automatically fetches the
  // next task in the sequence (or the done task).
  const interactionRes = await fetch(`${process.env.FASTAPI_URL}/api/v1/tasks/interaction`, {
    method: "POST",
    headers: {
      "X-API-Key": process.env.FASTAPI_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      type: update_type,
      user: {
        id: token.sub,
        display_name: token.name || token.email,
        auth_method: "local",
      },
      message_id: id,
      user_message_id: interaction.id,
      ...content,
    }),
  });
  const newTask = await interactionRes.json();

  // Stores the new task with our database.
  const newRegisteredTask = await prisma.registeredTask.create({
    data: {
      task: newTask,
      user: {
        connect: {
          id: token.sub,
        },
      },
    },
  });

  // Send the next task in the sequence to the client.
  res.status(200).json(newRegisteredTask);
};

export default handler;
