import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
import { cookies } from "next/headers";
import { NextResponse, NextRequest } from "next/server";
import { Database } from "@/types/supabase";
import prisma from "@/lib/prisma";

import * as z from "zod";
import openai from "@/lib/openai";
import { completion } from "zod-gpt";
import { generateProjectQuestions } from "@/lib/prompts";

const MIN_QUESTIONS = 1;
const MAX_QUESTIONS = 3;

type Question = {
  question: string;
  answer: string;
};

async function getSession(supabase: any) {
  const {
    data: { session },
  } = await supabase.auth.getSession();
  return session;
}

// generate questions for user about their project
export async function GET(
  req: NextRequest,
  { params: { projectID } }: { params: { projectID: string } }
) {
  const supabase = createRouteHandlerClient<Database>({ cookies });
  const session = await getSession(supabase);

  if (!session) return NextResponse.redirect("/auth");

  try {
    // TODO: generate questions for user about their project
    // 1. get project name, description, and stack
    console.log("PROJECT ID", projectID);
    const project = await prisma.project.findUnique({
      where: {
        id: BigInt(projectID),
      },
    });

    if (!project) {
      return NextResponse.json({ error: "Project not found" }, { status: 404 });
    }

    const { name, description, stack } = project;

    // 2. generate questions
    const question_prompt = generateProjectQuestions(
      name,
      description ? description : "",
      stack
    );

    const res = await completion(openai, question_prompt, {
      schema: z.object({
        questions: z
          .array(
            z.string().describe("A question to ask the user about the project")
          )
          .min(MIN_QUESTIONS)
          .max(MAX_QUESTIONS),
      }),
    });

    console.log(res.data.questions);

    return NextResponse.json(
      { questions: res.data.questions },
      { status: 200 }
    );
  } catch (err) {
    console.error(err);
    return NextResponse.json({ error: err }, { status: 500 });
  }
}

export async function PUT(
  req: NextRequest,
  { params: { projectID } }: { params: { projectID: string } }
) {
  const supabase = createRouteHandlerClient<Database>({ cookies });
  const session = await getSession(supabase);

  if (!session) return NextResponse.redirect("/auth");

  try {
    const req_data = await req.json();
    const questions: Question[] = req_data;

    const res = await prisma.project.update({
      where: {
        id: BigInt(projectID),
      },
      data: {
        questions,
      },
    });

    return NextResponse.json(
      { message: "Completed successfully" },
      { status: 200 }
    );
  } catch (err) {
    console.error(err);
    return NextResponse.json({ error: err }, { status: 500 });
  }
}