import Anthropic from "@anthropic-ai/sdk";

/**
 * Generowanie odpowiedzi -- port logiki z lokalnego MVP (src/query.py).
 * Te same zasady: odpowiedź wyłącznie na podstawie dostarczonych
 * fragmentów, obowiązkowe cytowanie paragrafu, stałe zastrzeżenie
 * "AI może się mylić", zero decyzji za agenta.
 */

export const SYSTEM_PROMPT = `Jesteś asystentem agenta ubezpieczeniowego. Odpowiadasz
WYŁĄCZNIE na podstawie dostarczonych fragmentów OWU -- nie korzystasz z
własnej wiedzy o produktach ubezpieczeniowych. Zasady:

1. Każde twierdzenie musi się powoływać na konkretny fragment (podaj etykietę
   paragrafu i nazwę dokumentu źródłowego dokładnie tak, jak podano we fragmentach).
2. Jeśli dostarczone fragmenty nie zawierają odpowiedzi, napisz to wprost --
   nie zgaduj i nie uzupełniaj wiedzą spoza fragmentów.
3. Zakończ odpowiedź zdaniem: "AI może się mylić -- zweryfikuj z oryginałem OWU."
4. Nie podejmuj decyzji za agenta (np. "wypłać odszkodowanie") -- tylko
   informuj, co wynika z dokumentu.`;

export interface RetrievedChunk {
  chunkId: string;
  documentTitle: string;
  sourceFile: string;
  paragraphLabel: string;
  chunkText: string;
  rank: number;
}

export function buildContext(results: RetrievedChunk[]): string {
  return results
    .map(
      (r) =>
        `[Źródło: ${r.sourceFile}, ${r.paragraphLabel}, trafność ${r.rank.toFixed(2)}]\n${r.chunkText}`
    )
    .join("\n\n---\n\n");
}

/** Patrz src/query.py `confidence_label` -- te same progi, ten sam cel:
 * jawnie nazwany, orientacyjny szacunek trafienia w bazę OWU, nie pewności
 * co do treści samej odpowiedzi. */
export function confidenceLabel(topRank: number): "wysoka" | "średnia" | "niska" {
  if (topRank >= 0.4) return "wysoka";
  if (topRank >= 0.15) return "średnia";
  return "niska";
}

export async function generateAnswer(question: string, context: string): Promise<string> {
  const apiKey = (process.env.ANTHROPIC_API_KEY || "").trim().replace(/^["']|["']$/g, "");
  if (!apiKey) {
    return "[Brak ANTHROPIC_API_KEY w konfiguracji -- pokazuję tylko odnalezione fragmenty (patrz wyżej).]";
  }

  const client = new Anthropic({ apiKey });
  const model = process.env.ANTHROPIC_MODEL || "claude-sonnet-4-5";

  try {
    const response = await client.messages.create({
      model,
      max_tokens: 1024,
      system: SYSTEM_PROMPT,
      messages: [
        {
          role: "user",
          content: `Fragmenty OWU:\n\n${context}\n\nPytanie agenta: ${question}`,
        },
      ],
    });
    const block = response.content[0];
    return block.type === "text" ? block.text : "[Nieoczekiwany format odpowiedzi AI.]";
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : String(err);
    return (
      `[Błąd wywołania Anthropic API: ${message}\n\n` +
      "Sprawdź: czy klucz w zmiennych środowiskowych jest poprawny i aktywny, " +
      "czy na koncie na console.anthropic.com są dostępne środki, oraz czy " +
      "ANTHROPIC_MODEL to prawidłowa nazwa modelu -- pokazuję tylko odnalezione " +
      "fragmenty (patrz wyżej).]"
    );
  }
}
