
import { createAdminClient } from "@/lib/supabase-server";

export async function updateProductCost(productId: string) {
  const supabase = createAdminClient();

  // Fetch product estimated base cost
  const { data: product, error: prodError } = await supabase
    .from('products')
    .select('estimated_base_cost')
    .eq('id', productId)
    .single();
  
  if (prodError || !product) {
    console.error("Error fetching product for cost update:", prodError);
    return;
  }

  // Fetch materials cost
  const { data: materials, error: matError } = await supabase
    .from('product_materials')
    .select('cost_total, quando_sai')
    .eq('product_id', productId);

  // Fetch processes cost
  const { data: processes, error: procError } = await supabase
    .from('product_processes')
    .select('cost_total')
    .eq('product_id', productId);

  if (matError || procError) {
    console.error("Error fetching composition costs:", matError, procError);
    return;
  }

  /* Estoque v2: a linha "só se a opção X" não entra no custo base — ela só
     acontece quando a opção é escolhida. Fora do v2 nenhuma linha é
     `se_opcao`, então a soma é a de sempre. */
  const matCost = (materials || []).reduce(
    (acc, m) => ((m as { quando_sai?: string | null }).quando_sai === 'se_opcao' ? acc : acc + (Number(m.cost_total) || 0)),
    0
  );
  const procCost = (processes || []).reduce((acc, p) => acc + (Number(p.cost_total) || 0), 0);
  const baseCost = Number(product.estimated_base_cost || 0);
  
  const totalCost = baseCost + matCost + procCost;

  // Update product
  const { error: updateError } = await supabase
    .from('products')
    .update({ 
      cost_total: totalCost,
      cost_breakdown: {
        estimated: baseCost,
        materials: matCost,
        processes: procCost
      }
    })
    .eq('id', productId);

  if (updateError) {
    console.error("Error updating product cost:", updateError);
  }
}
