import { NextResponse } from "next/server";
import {
  buildKnowledgeGapSource,
  buildKnowledgeSources,
  buildProfileContextSources,
  buildRecentSessionContext,
  generateCoachReply,
} from "@/lib/coach";
import { searchDemoKnowledgeBase } from "@/lib/demo-content";
import { DemoCoachReplyRequestSchema } from "@/lib/schemas";

export const runtime = "nodejs";

export async function POST(request: Request) {
  try {
    const payload = DemoCoachReplyRequestSchema.parse(await request.json());
    const sessionContext = buildRecentSessionContext(
      payload.recentSessions.map((session) => ({
        scenario_title: session.scenarioTitle,
        scenario_target_skill: session.scenarioTargetSkill,
        status: session.status,
        updated_at: session.updatedAt,
        final_assessment: session.finalAssessment
          ? {
              summary: session.finalAssessment.summary,
              readiness: session.finalAssessment.readiness,
              actionPlan: session.finalAssessment.actionPlan,
            }
          : null,
      })),
    );
    const knowledgeMatches = await searchDemoKnowledgeBase(payload.userMessage);
    const assistantContent = await generateCoachReply({
      userMessage: payload.userMessage,
      conversationHistory: payload.history,
      onboardingPromptContext: payload.onboardingPromptContext,
      actionPlanPrompt: payload.actionPlanPrompt,
      recentSessionContext: sessionContext.text,
      knowledgeMatches,
    });

    const assistantSources = [
      ...buildProfileContextSources({
        onboardingPromptContext: payload.onboardingPromptContext,
        actionPlanPrompt: payload.actionPlanPrompt,
      }),
      ...sessionContext.sources.slice(0, 3),
      ...(knowledgeMatches.length > 0
        ? buildKnowledgeSources(knowledgeMatches)
        : [buildKnowledgeGapSource()]),
    ];

    return NextResponse.json({
      assistantMessage: {
        id: crypto.randomUUID(),
        conversationId: payload.conversationId,
        role: "assistant",
        content: assistantContent,
        createdAt: new Date().toISOString(),
        sources: assistantSources,
      },
    });
  } catch (error) {
    const message =
      error instanceof Error ? error.message : "Le coach n'a pas pu repondre.";
    const statusCode = message.includes("OPENAI_API_KEY") ? 503 : 400;

    return NextResponse.json({ error: message }, { status: statusCode });
  }
}
