import { NextResponse } from "next/server";

type ChatProvider = "groq" | "openai" | "ollama" | "gemini";

type ChatRequestBody = {
  provider?: ChatProvider;
  apiKey?: string;
  userMessageContent?: string;
};

type ProviderErrorResponse = {
  error?: {
    message?: string;
  };
};

type ChatCompletionResponse = {
  choices?: Array<{
    message?: {
      content?: string;
    };
  }>;
};

type OllamaResponse = {
  response?: string;
};

function getErrorMessage(error: unknown) {
  return error instanceof Error ? error.message : "Bilinmeyen sunucu hatası";
}

export async function POST(request: Request) {
  try {
    const body = (await request.json()) as ChatRequestBody;
    const provider = body.provider ?? "ollama";
    const apiKey = body.apiKey ?? "";
    const userMessageContent = body.userMessageContent?.trim();

    if (!userMessageContent) {
      return NextResponse.json(
        { error: "Mesaj içeriği boş olamaz." },
        { status: 400 },
      );
    }

    let assistantReply = "";

    if (provider === "gemini") {
      const response = await fetch(
        `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent?key=${apiKey}`,
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            system_instruction: {
              parts: [{ text: "Sen MindSpace adlı kullanıcının kişisel yapay zeka terapistisin ve sırdaşısın. Şefkatli, yargılamayan ve destekleyici cevaplar ver. Kullanıcının iş süreçlerini asiste edebilirsin." }]
            },
            contents: [
              {
                parts: [{ text: userMessageContent }]
              }
            ]
          }),
        }
      );

      if (!response.ok) {
        throw new Error("Gemini API hatası");
      }

      const data = await response.json();
      assistantReply = data.candidates?.[0]?.content?.parts?.[0]?.text ?? "";

    } else if (provider === "groq") {
      const response = await fetch(
        "https://api.groq.com/openai/v1/chat/completions",
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            Authorization: `Bearer ${apiKey}`,
          },
          body: JSON.stringify({
            model: "llama-3.1-8b-instant",
            messages: [
              {
                role: "system",
                content:
                  "Sen MindSpace adlı kullanıcının kişisel yapay zeka terapistisin ve sırdaşısın. Şefkatli, yargılamayan ve destekleyici cevaplar ver. Yüzeysel öğütlerden kaçın.",
              },
              { role: "user", content: userMessageContent },
            ],
          }),
        },
      );

      if (!response.ok) {
        const errorData = (await response.json()) as ProviderErrorResponse;
        throw new Error(errorData.error?.message || "Groq API hatası");
      }

      const data = (await response.json()) as ChatCompletionResponse;
      assistantReply = data.choices?.[0]?.message?.content ?? "";
    } else if (provider === "openai") {
      const response = await fetch("https://api.openai.com/v1/chat/completions", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${apiKey}`,
        },
        body: JSON.stringify({
          model: "gpt-4o",
          messages: [
            {
              role: "system",
              content:
                "Sen MindSpace adlı kullanıcının kişisel yapay zeka terapistisin ve sırdaşısın. Şefkatli ve destekleyici cevap ver.",
            },
            { role: "user", content: userMessageContent },
          ],
        }),
      });

      if (!response.ok) {
        throw new Error("OpenAI API hatası");
      }

      const data = (await response.json()) as ChatCompletionResponse;
      assistantReply = data.choices?.[0]?.message?.content ?? "";
    } else {
      const response = await fetch("http://127.0.0.1:11434/api/generate", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          model: "llama3",
          prompt: `Sen MindSpace adlı kullanıcının kişisel yapay zeka terapistisin ve sırdaşısın. Şefkatli ve destekleyici cevap ver.\n\nKullanıcı: ${userMessageContent}\nTerapist:`,
          stream: false,
        }),
      });

      if (!response.ok) {
        throw new Error("Ollama API yanıt vermedi.");
      }

      const data = (await response.json()) as OllamaResponse;
      assistantReply = data.response ?? "";
    }

    if (!assistantReply) {
      throw new Error("Model geçerli bir yanıt üretmedi.");
    }

    return NextResponse.json({ reply: assistantReply });
  } catch (error: unknown) {
    const message = getErrorMessage(error);
    console.error("API route hatası:", error);

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