import type { User } from "@supabase/supabase-js";
import { getCompanyContext } from "@/lib/company-context";
import { buildPublicCatalogUrl } from "@/lib/public-catalog-url";
import { getSupabaseClient } from "@/lib/supabase";

type PublicStatusProfile = {
  slug?: string | null;
  custom_domain?: string | null;
  custom_domain_verified?: boolean | null;
};

export function generatePublicStatusToken() {
  const bytes = new Uint8Array(24);
  crypto.getRandomValues(bytes);
  return Array.from(bytes)
    .map((b) => b.toString(16).padStart(2, "0"))
    .join("");
}

export function buildPublicOrderStatusUrl(
  origin: string,
  profile: PublicStatusProfile | null | undefined,
  token: string | null | undefined
) {
  const trimmedToken = String(token || "").trim();
  if (!trimmedToken) return null;

  const slug = String(profile?.slug || "").trim();
  if (!slug && !(profile?.custom_domain && profile?.custom_domain_verified)) {
    return null;
  }

  return buildPublicCatalogUrl(origin, profile, {
    slugPath: `/${slug}/status/${trimmedToken}`,
    customPath: `/status/${trimmedToken}`,
  });
}

export async function ensureOrderPublicStatusToken(params: {
  orderId: string;
  user: User;
  existingToken?: string | null;
  existingEnabled?: boolean | null;
}) {
  const supabase = getSupabaseClient();
  const currentToken = String(params.existingToken || "").trim();
  const shouldEnableOnly = Boolean(currentToken) && params.existingEnabled !== false;

  if (shouldEnableOnly) {
    return currentToken;
  }

  const ctx = await getCompanyContext(supabase, params.user);
  const tenantIds = ctx.tenantIds?.length ? ctx.tenantIds : [params.user.id];

  let token = currentToken || generatePublicStatusToken();
  let { error } = await supabase
    .from("orders")
    .update({ share_enabled: true, share_token: token })
    .eq("id", params.orderId)
    .in("user_id", tenantIds);

  if (error && (error as { code?: string } | null)?.code === "23505") {
    token = generatePublicStatusToken();
    const retryResult = await supabase
      .from("orders")
      .update({ share_enabled: true, share_token: token })
      .eq("id", params.orderId)
      .in("user_id", tenantIds);
    error = retryResult.error;
  }

  if (error) {
    throw error;
  }

  return token;
}
