// Evolution API v2 client

const BASE_URL = (process.env.EVOLUTION_API_URL ?? "").trim().replace(/\/$/, "");
const API_KEY = (process.env.EVOLUTION_API_KEY ?? "").trim();
const INSTANCE = (process.env.EVOLUTION_INSTANCE_NAME ?? "myristica").trim();

function evoHeaders(): HeadersInit {
  return {
    "Content-Type": "application/json",
    apikey: API_KEY,
  };
}

export async function sendText(to: string, text: string) {
  const res = await fetch(`${BASE_URL}/message/sendText/${INSTANCE}`, {
    method: "POST",
    headers: evoHeaders(),
    body: JSON.stringify({ number: to, text }),
  });
  if (!res.ok) {
    const errBody = await res.text();
    console.error("Evolution sendText error:", errBody);
    return null;
  }
  return res.json();
}

export interface ButtonOption {
  id: string;
  text: string;
}

export async function sendButtons(
  to: string,
  title: string,
  body: string,
  buttons: ButtonOption[]
) {
  const res = await fetch(`${BASE_URL}/message/sendButtons/${INSTANCE}`, {
    method: "POST",
    headers: evoHeaders(),
    body: JSON.stringify({
      number: to,
      title,
      description: body,
      footer: "Myristica · Arcos 1836",
      buttons: buttons.map((b) => ({
        id: b.id,
        text: b.text,
        buttonId: b.id,
        displayText: b.text,
        buttonText: { displayText: b.text },
        type: 1,
      })),
    }),
  });
  if (!res.ok) {
    // Fallback to plain text if buttons not supported
    const opts = buttons.map((b, i) => `${i + 1}. ${b.text}`).join("\n");
    return sendText(to, `${title}\n${body}\n\n${opts}\n\nResponde con el numero de la opcion.`);
  }
  return res.json();
}

export async function downloadMediaAsBase64(message: object): Promise<string | null> {
  const res = await fetch(`${BASE_URL}/chat/getBase64FromMediaMessage/${INSTANCE}`, {
    method: "POST",
    headers: evoHeaders(),
    body: JSON.stringify({ message, convertToMp4: false }),
  });

  if (!res.ok) {
    console.error("downloadMediaAsBase64 error:", res.status, await res.text());
    return null;
  }

  const data = await res.json();
  const base64 = typeof data.base64 === "string" ? data.base64 : null;

  if (!base64) {
    console.error("downloadMediaAsBase64 missing base64:", data);
    return null;
  }

  return base64.startsWith("data:") ? (base64.split(",", 2)[1] ?? null) : base64;
}

export async function getGroups(): Promise<Array<{ id: string; subject: string }>> {
  const res = await fetch(`${BASE_URL}/group/fetchAllGroups/${INSTANCE}?getParticipants=false`, {
    headers: evoHeaders(),
  });
  if (!res.ok) return [];
  return res.json();
}

export async function uploadMedia(
  base64: string,
  mimetype: string,
  filename?: string
): Promise<string | null> {
  const res = await fetch(`${BASE_URL}/media/upload`, {
    method: "POST",
    headers: evoHeaders(),
    body: JSON.stringify({ base64, mimetype, filename }),
  });
  if (!res.ok) {
    console.error("uploadMedia error:", await res.text());
    return null;
  }
  const data = await res.json();
  return (data.url as string) ?? null;
}

export async function sendMedia(
  to: string,
  mediaUrl: string,
  mimetype: string,
  caption?: string,
  mediaType: "image" | "document" = "image",
  fileName?: string
) {
  const res = await fetch(`${BASE_URL}/message/sendMedia/${INSTANCE}`, {
    method: "POST",
    headers: evoHeaders(),
    body: JSON.stringify({
      number: to,
      media: mediaUrl,
      mediatype: mediaType,
      mimetype,
      caption: caption ?? "",
      fileName: fileName ?? "image.png",
    }),
  });
  if (!res.ok) {
    console.error("Evolution sendMedia error:", res.status, await res.text());
    return null;
  }
  console.log("[EVOLUTION] sendMedia OK for", to);
  return res.json();
}

export async function sendPresence(to: string, presence: "composing" | "paused" | "available") {
  try {
    const res = await fetch(`${BASE_URL}/chat/sendPresence/${INSTANCE}`, {
      method: "POST",
      headers: evoHeaders(),
      body: JSON.stringify({ number: to, presence }),
    });

    if (!res.ok) {
      console.error("Evolution sendPresence error:", res.status, await res.text());
      return false;
    }

    return true;
  } catch (error) {
    console.error("Evolution sendPresence network error:", error);
    return false;
  }
}
