import { NextRequest, NextResponse } from "next/server";
import { db, recipes, users, userFollows, eq, and, ne, sql } from "@epicure/db";
import { requireSessionOrApiKey } from "@/lib/api-auth";
import { desc, inArray } from "@epicure/db";
import { attachCardExtras } from "@/lib/recipe-card-extras";

export async function GET(req: NextRequest) {
  const { session, response } = await requireSessionOrApiKey(req);
  if (response) return response;

  const { searchParams } = new URL(req.url);
  const limit = Math.min(parseInt(searchParams.get("limit") ?? "20"), 50);
  const offset = parseInt(searchParams.get("offset") ?? "0");

  // Get IDs of users the current user follows
  const followedRows = await db
    .select({ followingId: userFollows.followingId })
    .from(userFollows)
    .where(eq(userFollows.followerId, session!.user.id));

  const followedIds = followedRows.map((r) => r.followingId);

  if (followedIds.length === 0) {
    return NextResponse.json({ data: [], total: 0, limit, offset, message: "Follow some users to see their recipes here." });
  }

  const where = and(inArray(recipes.authorId, followedIds), ne(recipes.visibility, "private"));

  const [feedRecipes, totalRow] = await Promise.all([
    db
      .select({
        id: recipes.id,
        title: recipes.title,
        description: recipes.description,
        baseServings: recipes.baseServings,
        prepMins: recipes.prepMins,
        cookMins: recipes.cookMins,
        difficulty: recipes.difficulty,
        visibility: recipes.visibility,
        tags: recipes.tags,
        isBatchCook: recipes.isBatchCook,
        sourceUrl: recipes.sourceUrl,
        recipeType: recipes.recipeType,
        coverIcon: recipes.coverIcon,
        coverColor: recipes.coverColor,
        createdAt: recipes.createdAt,
        updatedAt: recipes.updatedAt,
        authorId: recipes.authorId,
        authorName: users.name,
        authorUsername: users.username,
        authorAvatarUrl: users.avatarUrl,
      })
      .from(recipes)
      .innerJoin(users, eq(recipes.authorId, users.id))
      .where(where)
      .orderBy(desc(recipes.createdAt))
      .limit(limit)
      .offset(offset),
    db
      .select({ total: sql<number>`count(*)::int` })
      .from(recipes)
      .innerJoin(users, eq(recipes.authorId, users.id))
      .where(where),
  ]);

  const total = totalRow[0]?.total ?? 0;
  const data = await attachCardExtras(feedRecipes, session!.user.id);

  return NextResponse.json({ data, total, limit, offset });
}
