import { createHash } from "node:crypto";
import { env } from "../env.js";

function sanitizeFileName(fileName: string) {
  return fileName.replace(/[^a-zA-Z0-9._-]+/g, "_");
}

function resolveImageKitFolder(folder?: string) {
  const normalizedFolder = String(folder ?? env.IMAGEKIT_UPLOAD_FOLDER ?? "").trim();
  return normalizedFolder || null;
}

export function isImageKitConfigured() {
  return Boolean(env.IMAGEKIT_PRIVATE_KEY.trim() && env.IMAGEKIT_UPLOAD_ENDPOINT.trim());
}

export async function uploadBinaryFileToImageKit(input: {
  bytes: Buffer;
  fileName: string;
  mimeType: string;
  folder?: string;
}) {
  if (!isImageKitConfigured()) {
    throw new Error("ImageKit is not configured.");
  }

  const safeName = sanitizeFileName(input.fileName) || `file_${Date.now()}`;
  const mimeType = input.mimeType.trim() || "application/octet-stream";
  const body = new URLSearchParams();
  body.set("file", `data:${mimeType};base64,${input.bytes.toString("base64")}`);
  body.set("fileName", safeName);
  const folder = resolveImageKitFolder(input.folder);
  if (folder) {
    body.set("folder", folder);
  }
  body.set("useUniqueFileName", "true");

  const response = await fetch(env.IMAGEKIT_UPLOAD_ENDPOINT, {
    method: "POST",
    headers: {
      Authorization: `Basic ${Buffer.from(`${env.IMAGEKIT_PRIVATE_KEY}:`).toString("base64")}`,
      "Content-Type": "application/x-www-form-urlencoded",
    },
    body,
  });

  const payload = await response.json().catch(() => null);

  if (!response.ok || !payload || typeof payload !== "object") {
    const providerMessage =
      payload && typeof payload === "object" && "message" in payload && typeof payload.message === "string"
        ? payload.message.trim()
        : "";
    throw new Error(
      providerMessage
        ? `Falha ao enviar arquivo para o ImageKit: ${providerMessage}`
        : "Falha ao enviar arquivo para o ImageKit.",
    );
  }

  const filePath =
    typeof payload.filePath === "string" && payload.filePath.trim()
      ? payload.filePath.trim()
      : typeof payload.url === "string" && payload.url.trim()
        ? payload.url.trim()
        : typeof payload.fileId === "string" && payload.fileId.trim()
          ? payload.fileId.trim()
          : "";

  if (!filePath) {
    throw new Error("ImageKit respondeu sem filePath.");
  }

  const storedFileName =
    typeof payload.name === "string" && payload.name.trim()
      ? payload.name.trim()
      : safeName;

  return {
    storageProvider: "imagekit",
    storageBucket: "imagekit",
    objectKey:
      typeof payload.url === "string" && payload.url.trim() ? payload.url.trim() : filePath,
    storageRegion: null,
    storedFileName,
    checksumSha256: createHash("sha256").update(input.bytes).digest("hex"),
    uploadUrl:
      typeof payload.url === "string" && payload.url.trim() ? payload.url.trim() : null,
  };
}
