import type { SupabaseClient, User } from "@supabase/supabase-js";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { ApiV1Error } from "@/lib/api-v1/errors";

export type OrderSummary = {
  id: string;
  number: number;
  status: string;
  total_amount: number;
  financial_status: string | null;
  created_at: string | null;
  updated_at: string | null;
  quote_id: string | null;
  quote_number: number | null;
  quote_title: string | null;
};

export type OrderItemSummary = {
  order_id: string;
  product_id: string | null;
  title: string;
  quantity: number;
  total_price: number;
};

type OrderRow = {
  id: string;
  number: number | null;
  status: string | null;
  total_amount: number | null;
  financial_status: string | null;
  created_at: string | null;
  updated_at: string | null;
  quote_id: string | null;
  quotes?: {
    id?: string | null;
    number?: number | null;
    title?: string | null;
  } | Array<{
    id?: string | null;
    number?: number | null;
    title?: string | null;
  }> | null;
};

function mapOrder(row: OrderRow): OrderSummary {
  const quote = Array.isArray(row.quotes) ? row.quotes[0] || null : row.quotes || null;
  return {
    id: String(row.id),
    number: Number(row.number || 0),
    status: String(row.status || "pending_production"),
    total_amount: Number(row.total_amount || 0),
    financial_status: row.financial_status ? String(row.financial_status) : null,
    created_at: row.created_at || null,
    updated_at: row.updated_at || null,
    quote_id: row.quote_id ? String(row.quote_id) : null,
    quote_number: typeof quote?.number === "number" ? quote.number : null,
    quote_title: quote?.title ? String(quote.title) : null,
  };
}

export async function listCustomerOrders(params: {
  supabase: SupabaseClient;
  user: User;
  clientId: string;
  limit?: number;
}) {
  const ctx = await getCompanyContext(params.supabase, params.user);
  if (!canCompany(ctx, params.user.id, "orders.read")) {
    throw new ApiV1Error(403, "forbidden", "Sem permissao para visualizar pedidos.");
  }

  const tenantIds = ctx.tenantIds?.length ? ctx.tenantIds : [params.user.id];
  let query = params.supabase
    .from("orders")
    .select("id,number,status,total_amount,financial_status,created_at,updated_at,quote_id,quotes(id,number,title)")
    .eq("client_id", params.clientId)
    .in("user_id", tenantIds)
    .order("created_at", { ascending: false });

  if (params.limit && params.limit > 0) {
    query = query.limit(params.limit);
  }

  const { data, error } = await query;
  if (error) {
    throw new ApiV1Error(400, "orders_fetch_failed", error.message);
  }

  return {
    ok: true,
    data: ((data || []) as OrderRow[]).map(mapOrder),
  };
}

export async function listOrderItemsByOrderIds(params: {
  supabase: SupabaseClient;
  user: User;
  orderIds: string[];
}) {
  const ctx = await getCompanyContext(params.supabase, params.user);
  if (!canCompany(ctx, params.user.id, "orders.read")) {
    throw new ApiV1Error(403, "forbidden", "Sem permissao para visualizar pedidos.");
  }

  if (!params.orderIds.length) {
    return {
      ok: true,
      data: [] as OrderItemSummary[],
    };
  }

  const { data, error } = await params.supabase
    .from("order_items")
    .select("order_id,product_id,title,quantity,total_price")
    .in("order_id", params.orderIds);

  if (error) {
    throw new ApiV1Error(400, "order_items_fetch_failed", error.message);
  }

  return {
    ok: true,
    data: ((data || []) as Array<Record<string, unknown>>).map((row) => ({
      order_id: String(row.order_id || ""),
      product_id: row.product_id ? String(row.product_id) : null,
      title: String(row.title || ""),
      quantity: Number(row.quantity || 0),
      total_price: Number(row.total_price || 0),
    })),
  };
}
