import Link from "next/link";
import LoginClient from "@/app/login/login-client";
import CompanyProfileClient from "./company-profile-client";
import type { AssinaturaCakto, Evento, FalhaCakto, FichaEmpresa, Nota, PagamentoCakto } from "./tipos";
import { createAdminClient } from "@/lib/supabase-admin";
import { createClient } from "@/lib/supabase-server";
import { isOwnerUser } from "@/lib/owner-auth";

/* Ficha de uma empresa. A chave da URL e o id do users_app (o cadastro de
   acesso), nao o e-mail: e-mail em URL vaza nos logs e no historico. */

export const dynamic = "force-dynamic";

function Aviso({ titulo, texto }: { titulo: string; texto: string }) {
  return (
    <div className="flex min-h-screen items-center justify-center p-6">
      <div className="w-full max-w-lg rounded-2xl border border-slate-200 bg-white p-6 text-center shadow-lg">
        <h1 className="text-xl font-semibold text-slate-900">{titulo}</h1>
        <p className="mt-2 text-sm text-slate-500">{texto}</p>
        <Link
          href="/companies"
          className="mt-5 inline-flex rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50"
        >
          Voltar para empresas
        </Link>
      </div>
    </div>
  );
}

export default async function CompanyProfilePage({
  params,
}: {
  params: Promise<{ id: string }>;
}) {
  const { id } = await params;

  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();

  if (!user) return <LoginClient />;
  if (!isOwnerUser({ id: user.id, email: user.email })) {
    return <Aviso titulo="Acesso negado" texto="Seu usuário não tem permissão para acessar este painel." />;
  }

  const admin = createAdminClient();

  const { data: acesso } = await admin
    .from("users_app")
    .select("id,email,name,status,plan,plan_name,expires_at,created_at,updated_at")
    .eq("id", id)
    .maybeSingle();

  if (!acesso) {
    return <Aviso titulo="Empresa não encontrada" texto="Esse cadastro de acesso não existe mais." />;
  }

  const email = String(acesso.email || "");

  /* O users_app nao guarda o id de autenticacao — a ligacao e so pelo e-mail.
     Por isso a busca precisa acontecer aqui antes de qualquer agregacao. */
  const { data: authId, error: erroBusca } = await admin.rpc("get_auth_user_id_by_email", {
    p_email: email,
  });

  const userId = typeof authId === "string" && authId ? authId : null;

  let ficha: FichaEmpresa | null = null;
  if (userId) {
    const { data } = await admin.rpc("get_company_overview", { p_user_id: userId });
    ficha = (data as FichaEmpresa) ?? null;
  }

  /* Ultimo acesso so existe no auth. getUserById busca uma linha so, entao
     nao esbarra no problema da listagem inteira. */
  let ultimoLogin: string | null = null;
  let loginBloqueado = false;
  if (userId) {
    const { data: authUser } = await admin.auth.admin.getUserById(userId);
    const u = authUser?.user as { last_sign_in_at?: string | null; banned_until?: string | null } | undefined;
    ultimoLogin = u?.last_sign_in_at ?? null;
    const ban = u?.banned_until ? new Date(u.banned_until) : null;
    loginBloqueado = Boolean(ban && ban.getTime() > Date.now());
  }

  /* Anotacoes e historico sao do dono, nao da empresa: vem por e-mail, que e
     o que liga o cadastro de acesso ao resto. */
  const emailMinusculo = email.trim().toLowerCase();
  const [{ data: notas }, { data: eventos }, { data: assinaturasCakto }, { data: pagamentosCakto }, { data: falhasCakto }] = await Promise.all([
    admin
      .from("owner_company_notes")
      .select("id,note,author_email,created_at")
      .ilike("email", email)
      .order("created_at", { ascending: false })
      .limit(50),
    admin
      .from("owner_company_events")
      .select("id,action,detail,author_email,created_at")
      .ilike("email", email)
      .order("created_at", { ascending: false })
      .limit(30),
    /* A assinatura pela rota oficial da Cakto (planos novos, e os antigos que
       ela cancelou na troca de plano). */
    admin
      .from("assinaturas_cakto")
      .select("cakto_subscription_id,produto_id,oferta_id,plano,situacao,metodo,pago_ate,proxima_cobranca,dias_de_credito,cancelar_na_cakto,cancelada_na_cakto_em,erro_ao_cancelar,substituida_por,criada_em")
      .eq("email", emailMinusculo)
      .order("criada_em", { ascending: false })
      .limit(20),
    admin
      .from("pagamentos_cakto")
      .select("pedido_id,ref_id,plano,valor,metodo,status,criado_em,pago_em")
      .eq("email", emailMinusculo)
      .order("criado_em", { ascending: false })
      .limit(30),
    admin
      .from("subscription_webhook_events")
      .select("id,event_type,status,processing_details,tentativas,created_at")
      .eq("provider", "cakto")
      .eq("customer_email", emailMinusculo)
      .eq("status", "failed")
      .order("created_at", { ascending: false })
      .limit(10),
  ]);

  return (
    <CompanyProfileClient
      cakto={{
        assinaturas: (assinaturasCakto as AssinaturaCakto[] | null) ?? [],
        pagamentos: (pagamentosCakto as PagamentoCakto[] | null) ?? [],
        falhas: (falhasCakto as FalhaCakto[] | null) ?? [],
      }}
      notasIniciais={(notas as Nota[]) ?? []}
      eventos={(eventos as Evento[]) ?? []}
      acesso={{
        id: String(acesso.id),
        email,
        name: (acesso.name as string) ?? null,
        status: (acesso.status as string) ?? null,
        plan: (acesso.plan as string) ?? null,
        planName: (acesso.plan_name as string) ?? null,
        expiresAt: (acesso.expires_at as string) ?? null,
        createdAt: (acesso.created_at as string) ?? null,
      }}
      ficha={ficha}
      userId={userId}
      buscaFalhou={Boolean(erroBusca)}
      ultimoLogin={ultimoLogin}
      loginBloqueado={loginBloqueado}
      baseCatalogo={(process.env.NEXT_PUBLIC_PUBLIC_CATALOG_BASE_URL || "https://ktalogu.com.br").replace(/\/$/, "")}
    />
  );
}
