import { redirect } from "next/navigation";
import { supabaseServer } from "./supabase/server";
import { supabaseAdmin } from "./supabase-admin";

export type Role = "owner" | "marketing" | "cs_supervisor" | "cs" | "viewer";

export const ROLE_LABEL: Record<Role, string> = {
  owner: "Owner",
  marketing: "Marketing",
  cs_supervisor: "Supervisor CS",
  cs: "CS",
  viewer: "Viewer",
};

export const canEditLeads = (r: Role) => r === "owner" || r === "cs_supervisor" || r === "cs";
export const canConfigure = (r: Role) => r === "owner" || r === "marketing";

// Konteks request: db = klien user (kena RLS), admin = service role (hanya setelah cek akses).
export async function getCtx() {
  const db = await supabaseServer();
  const {
    data: { user },
  } = await db.auth.getUser();
  if (!user) redirect("/login");

  const [{ data: profile }, { data: m }] = await Promise.all([
    db.from("profiles").select("full_name, is_super_admin").eq("id", user.id).maybeSingle(),
    db
      .from("memberships")
      .select("org_id, role, organizations(name, is_active)")
      .eq("user_id", user.id)
      .eq("is_active", true)
      .order("created_at")
      .limit(1)
      .maybeSingle(),
  ]);

  const org = Array.isArray(m?.organizations) ? m?.organizations[0] : m?.organizations;
  return {
    db,
    admin: supabaseAdmin,
    user,
    name: (profile?.full_name as string | null) ?? user.email ?? "",
    isSuper: Boolean(profile?.is_super_admin),
    orgId: (m?.org_id as string | undefined) ?? null,
    role: (m?.role as Role | undefined) ?? null,
    orgName: (org?.name as string | undefined) ?? "",
    orgActive: org?.is_active as boolean | undefined,
  };
}

// Halaman yang butuh perusahaan aktif. Super admin tanpa perusahaan diarahkan ke /admin.
export async function requireOrg() {
  const c = await getCtx();
  if (!c.orgId || !c.role) redirect(c.isSuper ? "/admin" : "/login?e=2");
  if (c.orgActive === false) redirect("/login?e=3");
  return { ...c, orgId: c.orgId, role: c.role };
}
