import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { createAdminClient } from "@/lib/supabase-admin";

export async function POST(req: Request) {
  try {
    const { productId, action, slug } = await req.json();
    if (!productId || (action !== "add" && action !== "remove")) {
      return NextResponse.json({ error: "Parâmetros inválidos" }, { status: 400 });
    }

    /*
      Quem e o dono destes favoritos sai da sessao, e so dela.

      A versao anterior procurava a sessao em colunas que nao existem nesta
      tabela (`token` e `active`, quando os campos sao `token_hash` e
      `revoked_at`), entao a busca nunca achava nada e o codigo caia no
      `clientId` enviado no corpo da requisicao. Na pratica, qualquer pessoa
      podia mexer nos favoritos de qualquer cliente mandando o id na mao.
    */
    const cookieStore = await cookies();
    const token = String(cookieStore.get("ks_client_portal")?.value || "").trim();
    const lojaSlug = String(slug || "").trim();
    if (!token || !lojaSlug) {
      return NextResponse.json({ error: "Não autorizado" }, { status: 401 });
    }

    const admin = createAdminClient();
    const sessao = await admin.rpc("client_portal_get_session", {
      p_slug: lojaSlug,
      p_session_token: token,
    });
    const resolvedClientId = String(
      ((sessao.data as { client?: { id?: string } } | null)?.client?.id || "")
    ).trim();

    if (sessao.error || !resolvedClientId) {
      return NextResponse.json({ error: "Não autorizado" }, { status: 401 });
    }

    // Get current favorites
    const { data: clientData, error: clientError } = await admin
      .from("clients")
      .select("favorites")
      .eq("id", resolvedClientId)
      .single();

    if (clientError) {
      console.error("FAVORITES API - client not found", clientError);
      return NextResponse.json({ error: "Cliente não encontrado" }, { status: 404 });
    }

    let favorites: string[] = Array.isArray(clientData.favorites) ? clientData.favorites : [];
    
    if (action === "add" && !favorites.includes(productId)) {
      favorites.push(productId);
    } else if (action === "remove") {
      favorites = favorites.filter((id) => id !== productId);
    }

    const { error: updateError } = await admin
      .from("clients")
      .update({ favorites })
      .eq("id", resolvedClientId);

    if (updateError) {
      console.error("FAVORITES API - update error", updateError);
      return NextResponse.json({ error: "Erro ao atualizar favoritos" }, { status: 500 });
    }

    return NextResponse.json({ success: true, favorites });
  } catch (error) {
    console.error("FAVORITES API ERROR:", error);
    return NextResponse.json({ error: "Internal Server Error" }, { status: 500 });
  }
}
