
import { NextResponse } from "next/server";
import { createAdminClient, createClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext } from "@/lib/company-context";

export async function GET(req: Request) {
  const { supabase, user } = await getAuth();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "materials.read")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const adminSupabase = createAdminClient();
  /* ?papel=insumo: só o que vira produto. No estoque novo (v2) a tabela também
     guarda os produtos prontos (papel 'pronto'), que não fazem sentido em
     composição, receita de opção ou serviço. Fora do v2 não existe pronto:
     a lista é a mesma de sempre. */
  const soInsumos = new URL(req.url).searchParams.get("papel") === "insumo";
  let consulta = adminSupabase
    .from("materials")
    .select("*")
    .eq("user_id", ctx.companyId);
  if (soInsumos) consulta = consulta.neq("papel", "pronto");
  const { data, error } = await consulta.order("name");

  if (error) return NextResponse.json({ error: error.message }, { status: 400 });

  return NextResponse.json(data);
}

export async function POST(req: Request) {
  const { supabase, user } = await getAuth();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "materials.write")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const body = await req.json();
  
  // Debug logging
  console.log("Creating material with companyId:", ctx.companyId);
  const adminSupabase = createAdminClient();
  
  // Test if admin client works
  const { data: testData, error: testError } = await adminSupabase.from('materials').select('count').limit(1);
  if (testError) {
    console.error("Admin client test error:", testError);
  } else {
    console.log("Admin client test success:", testData);
  }

  const { data, error } = await adminSupabase
    .from("materials")
    .insert({
      ...body,
      user_id: ctx.companyId,
    })
    .select()
    .single();

  if (error) {
    console.error("Insert error:", error);
    return NextResponse.json({ error: error.message }, { status: 400 });
  }

  return NextResponse.json(data);
}

export async function PUT(req: Request) {
  const { supabase, user } = await getAuth();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "materials.write")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const body = await req.json();
  const { id, ...updates } = body;

  const adminSupabase = createAdminClient();
  const { data, error } = await adminSupabase
    .from("materials")
    .update(updates)
    .eq("id", id)
    .eq("user_id", ctx.companyId)
    .select()
    .single();

  if (error) return NextResponse.json({ error: error.message }, { status: 400 });

  return NextResponse.json(data);
}

export async function DELETE(req: Request) {
  const { supabase, user } = await getAuth();
  if (!user) return NextResponse.json({ error: "Não autenticado." }, { status: 401 });

  const ctx = await getCompanyContext(supabase, user);
  if (!canCompany(ctx, user.id, "materials.write")) {
    return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  }

  const { searchParams } = new URL(req.url);
  const id = searchParams.get("id");

  if (!id) return NextResponse.json({ error: "ID não fornecido." }, { status: 400 });

  const adminSupabase = createAdminClient();
  const { error } = await adminSupabase
    .from("materials")
    .delete()
    .eq("id", id)
    .eq("user_id", ctx.companyId);

  if (error) return NextResponse.json({ error: error.message }, { status: 400 });

  return NextResponse.json({ ok: true });
}

async function getAuth() {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  return { supabase, user };
}
