import { NextResponse } from "next/server";
import { createClient } from "@/utils/supabase/server";
import { createAdminClient } from "@/lib/supabase-server";
import { getCompanyContext, shouldUseEmployeeUi } from "@/lib/company-context";
import {
  cadastrarDominioPersonalizado,
  conferirDominioPedido,
  lerDominioPersonalizado,
  removerDominioPersonalizado,
} from "@/lib/dominio-personalizado";

/* A conta do domínio próprio mora em lib/dominio-personalizado.ts, que o
   assistente também usa. Aqui fica só quem pode e a resposta da tela. */

async function resolvePublicCatalogAccess(supabase: Awaited<ReturnType<typeof createClient>>) {
  const {
    data: { user },
  } = await supabase.auth.getUser();

  if (!user) {
    return {
      errorResponse: NextResponse.json({ error: "Usuário não autenticado." }, { status: 401 }),
    } as const;
  }

  const ctx = await getCompanyContext(supabase, user);
  const publicProfileId = ctx.ownerId || user.id;
  const canManageIdentity = !shouldUseEmployeeUi(ctx, user.id);

  return { user, ctx, publicProfileId, canManageIdentity } as const;
}

export async function GET() {
  try {
    const supabase = await createClient();
    const access = await resolvePublicCatalogAccess(supabase);
    if ("errorResponse" in access) return access.errorResponse;

    const admin = createAdminClient();
    const [{ data: profile, error: profileError }, dominio] = await Promise.all([
      admin.from("profiles").select("id,slug").eq("id", access.publicProfileId).maybeSingle(),
      lerDominioPersonalizado(admin, access.publicProfileId),
    ]);
    if (profileError) throw profileError;
    return NextResponse.json({
      data: {
        profile_id: access.publicProfileId,
        slug: profile?.slug || null,
        can_manage: access.canManageIdentity,
        ...dominio,
      },
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Erro ao carregar domínio customizado.";
    return NextResponse.json({ error: message }, { status: 500 });
  }
}

export async function POST(req: Request) {
  try {
    const body = (await req.json().catch(() => null)) as { domain?: string } | null;
    const conferido = conferirDominioPedido(body?.domain || "");
    if (!conferido.ok) {
      return NextResponse.json({ error: conferido.error }, { status: conferido.status });
    }

    const supabase = await createClient();
    const access = await resolvePublicCatalogAccess(supabase);
    if ("errorResponse" in access) return access.errorResponse;
    if (!access.canManageIdentity) {
      return NextResponse.json(
        { error: "Somente administrador pode alterar o link público da empresa." },
        { status: 403 }
      );
    }

    const resultado = await cadastrarDominioPersonalizado(createAdminClient(), access.publicProfileId, conferido.domain);
    if (!resultado.ok) {
      return NextResponse.json({ error: resultado.error }, { status: resultado.status });
    }

    return NextResponse.json({ ok: true, data: resultado.data });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Erro ao salvar domínio customizado.";
    return NextResponse.json({ error: message }, { status: 500 });
  }
}

export async function DELETE() {
  try {
    const supabase = await createClient();
    const access = await resolvePublicCatalogAccess(supabase);
    if ("errorResponse" in access) return access.errorResponse;
    if (!access.canManageIdentity) {
      return NextResponse.json(
        { error: "Somente administrador pode alterar o link público da empresa." },
        { status: 403 }
      );
    }

    const resultado = await removerDominioPersonalizado(createAdminClient(), access.publicProfileId);
    if (!resultado.ok) {
      return NextResponse.json({ error: resultado.error }, { status: resultado.status });
    }

    return NextResponse.json({ ok: true });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Erro ao remover domínio customizado.";
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
