import {
  getCoachModel,
  parseStructuredResponse,
} from "@/lib/openai";
import { ActionPlanSuggestionResponseSchema } from "@/lib/schemas";
import type { AutodiagnosticResult } from "@/lib/autodiagnostic-shared";
import type { OnboardingAnswers } from "@/lib/onboarding-shared";

function normalizeWhitespace(value: string) {
  return value.replace(/\s+/g, " ").trim();
}

function buildActionPlanSuggestionInput(input: {
  answers: OnboardingAnswers;
  autodiagnosticResult: AutodiagnosticResult;
}) {
  const { answers, autodiagnosticResult } = input;

  return [
    "CONTEXTE UTILISATEUR",
    `- secteur: ${answers.industrySector}`,
    `- departement: ${answers.department}`,
    `- fonction: ${answers.jobTitle}`,
    `- niveau_managerial: ${answers.managerialLevel}`,
    `- taille_entreprise: ${answers.companySize}`,
    `- contexte_entreprise: ${answers.companyContext}`,
    `- mode_de_travail: ${answers.workMode}`,
    "",
    "RESULTAT AUTODIAGNOSTIQUE",
    `- score_global: ${autodiagnosticResult.globalScore}/100`,
    `- lecture_globale: ${autodiagnosticResult.overallLabel}`,
    ...autodiagnosticResult.sectionScores.map(
      (section) =>
        `- ${section.title.toLowerCase()}: ${section.score}/100`,
    ),
    `- points_forts: ${autodiagnosticResult.strengths
      .map((item) => normalizeWhitespace(item))
      .join(" | ")}`,
    `- points_d_attention: ${autodiagnosticResult.attentionPoints
      .map((item) => normalizeWhitespace(item))
      .join(" | ")}`,
    `- synthese: ${normalizeWhitespace(autodiagnosticResult.summary)}`,
  ].join("\n");
}

function buildActionPlanSuggestionInstructions() {
  return [
    "Tu es un coach manager francophone.",
    "Tu generes un plan d'action individuel concret a partir du contexte utilisateur et du resultat de son autodiagnostic.",
    "Tu renvoies exactement 3 suggestions d'objectifs pour pre-remplir les 3 premiers objectifs du plan d'action.",
    "Chaque suggestion doit remplir tous les champs du format cible : objectiveLabel, whatToDo, howAndWithWhom, when, successCriteria, pointOfAttention.",
    "Les suggestions doivent etre specifiques, actionnables, realistes et directement modifiables par l'utilisateur.",
    "Appuie-toi d'abord sur les points d'attention de l'autodiagnostic, puis adapte les propositions au niveau managerial et au contexte de travail.",
    "Evite les formulations vagues, scolaires ou generiques.",
    "N'explique jamais le calcul du score et ne mentionne ni pondération ni pourcentage de poids.",
    "Redige en francais professionnel, avec des formulations courtes et precises.",
    "Les echeances doivent etre concretes mais plausibles sur quelques semaines ou quelques mois.",
  ].join("\n");
}

export async function generateActionPlanSuggestions(input: {
  answers: OnboardingAnswers;
  autodiagnosticResult: AutodiagnosticResult;
}) {
  return parseStructuredResponse({
    schema: ActionPlanSuggestionResponseSchema,
    schemaName: "action_plan_suggestions",
    model: getCoachModel(),
    instructions: buildActionPlanSuggestionInstructions(),
    input: buildActionPlanSuggestionInput(input),
    temperature: 0.6,
    maxOutputTokens: 1400,
  });
}
