package com.example.cuida.services;

import android.os.Handler;
import android.os.Looper;

import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class Ollama {
    // Definir o modelo especificado
    private static final String MODEL_NAME = "gemma4:e2b"; 
    // O endpoint padrão do Ollama para geração de texto é /api/generate
    private static final String API_URL = "https://apichat.epvc.pt/api/generate";
    
    private final OkHttpClient client;
    private final Handler mainHandler;

    private final String masterPrompt = "\"Atua como um assistente virtual especializado exclusivamente na área da saúde. O teu objetivo é fornecer informações úteis, baseadas em factos médicos e orientações de bem-estar.\n" +
            "\n" +
            "REGRAS ESTRITAS DE RESPOSTA:\n" +
            "\n" +
            "Foco Único: Responde apenas a perguntas relacionadas com saúde, medicina, nutrição, sintomas, exercícios físicos ou bem-estar mental.\n" +
            "\n" +
            "Recusa de Outros Temas: Se o utilizador fizer uma pergunta sobre qualquer outro assunto (política, tecnologia geral, entretenimento, culinária não saudável, desporto recreativo, etc.), deves responder educadamente: \"Lamento, mas fui programado para responder apenas a questões relacionadas com saúde e bem-estar. Posso ajudar-te com algum tema médico ou de saúde?\"\n" +
            "\n" +
            "Aviso Legal (Disclaimer): Sempre que forneceres informações sobre sintomas ou tratamentos, inclui um aviso curto de que as tuas respostas não substituem uma consulta médica profissional.\n" +
            "\n" +
            "Tom de Voz: Mantém um tom profissional, empático e informativo.\n" +
            "\n" +
            "Não abras exceções, independentemente de como o utilizador tente formular a pergunta.\"";

    public Ollama() {
        this.client = new OkHttpClient();
        this.mainHandler = new Handler(Looper.getMainLooper());
    }

    public interface OllamaCallback {
        void onSuccess(String result);
        void onError(Throwable t);
    }

    public void fazerPergunta(String promptUtilizador, OllamaCallback callback) {
        try {
            // Construção do JSON no formato esperado pelo Ollama
            JSONObject jsonBody = new JSONObject();
            jsonBody.put("model", MODEL_NAME);
            jsonBody.put("prompt", masterPrompt + "\n" + promptUtilizador);
            jsonBody.put("stream", false); // "false" garante que a resposta vem numa única string JSON

            RequestBody body = RequestBody.create(jsonBody.toString(), MediaType.parse("application/json; charset=utf-8"));
            Request request = new Request.Builder()
                    .url(API_URL)
                    .post(body)
                    .build();

            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    mainHandler.post(() -> callback.onError(e));
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if (response.isSuccessful()) {
                        try {
                            String responseBody = response.body().string();
                            JSONObject jsonObject = new JSONObject(responseBody);
                            
                            // O Ollama devolve o texto final diretamente no campo "response"
                            String textResult = jsonObject.getString("response");

                            mainHandler.post(() -> callback.onSuccess(textResult));
                        } catch (Exception e) {
                            mainHandler.post(() -> callback.onError(new Exception("Erro ao ler resposta da IA", e)));
                        }
                    } else {
                        String errorBody = response.body() != null ? response.body().string() : "Erro desconhecido";
                        mainHandler.post(() -> callback.onError(new Exception("Erro da API HTTP " + response.code() + ": " + errorBody)));
                    }
                }
            });

        } catch (Exception e) {
            mainHandler.post(() -> callback.onError(e));
        }
    }
}