import { NextResponse } from "next/server";
import NodeCache from "node-cache";

// Use a dynamic import for node-fetch so tests that mock it (via jest.mock) are respected
async function getFetch() {
  try {
    const mod = await import("node-fetch");
    // support both CJS and ESM interop
    return (mod as { default: unknown }).default ?? mod;
  } catch (_err) {
    return globalThis.fetch;
  }
}

export const runtime = "nodejs"; // Force Node runtime

const GHOST_API_URL = process.env.GHOST_API_URL;
const GHOST_API_KEY = process.env.GHOST_API_KEY;
const cache = new NodeCache({ stdTTL: 300 }); // Cache für 5 Minuten

type GhostPost = {
  slug: string;
  id: string;
  title: string;
  feature_image: string;
  visibility: string;
  published_at: string;
  updated_at: string;
  html: string;
  reading_time: number;
  meta_description: string;
};

type GhostPostsResponse = {
  posts: Array<GhostPost>;
};

export async function GET() {
  const cacheKey = "ghostPosts";
  const cachedPosts = cache.get<GhostPostsResponse>(cacheKey);

  if (cachedPosts) {
    return NextResponse.json(cachedPosts);
  }

  try {
    const fetchFn = await getFetch();
    const response = await (fetchFn as unknown as typeof fetch)(
      `${GHOST_API_URL}/ghost/api/content/posts/?key=${GHOST_API_KEY}&limit=all`,
    );
    const posts: GhostPostsResponse =
      (await response.json()) as GhostPostsResponse;

    if (!posts || !posts.posts) {
      console.error("Invalid posts data");
      return NextResponse.json([]);
    }

    cache.set(cacheKey, posts); // Daten im Cache speichern

    return NextResponse.json(posts);
  } catch (error) {
    console.error("Failed to fetch posts from Ghost:", error);
    return NextResponse.json(
      { error: "Failed to fetch projects" },
      { status: 500 },
    );
  }
}
