import { cookies } from "next/headers";
import { createAdminClient } from "@/lib/supabase-admin";
import {
  COOKIE_DA_EQUIPE,
  navegadorEhDaEquipe,
  resolverVisao,
  type ClienteDaVisao,
  type VisaoDoVisitante,
} from "@/lib/loja/regras-da-loja";

/*
  Quem esta olhando a loja, visto do servidor.

  Junta os dois cookies que importam (a sessao do portal do cliente e a marca
  do navegador da equipe) com as regras do perfil e devolve a visao pronta
  para a pagina: mostra preco?, pode comprar?, precisa entrar?

  Fica fora da lembranca da loja de proposito: a lembranca e a mesma para
  todos os visitantes, e isto muda de pessoa para pessoa. Qualquer falha aqui
  vira "visitante comum", nunca derruba a vitrine.
*/

export const COOKIE_DA_SESSAO = "ks_client_portal";

export type ClienteLogado = {
  id: string;
  name: string;
  avatar_url: string | null;
  favorites: string[] | null;
  status: "approved" | "pending" | "rejected";
  email?: string | null;
  phone?: string | null;
  whatsapp?: string | null;
  company_name?: string | null;
  document?: string | null;
};

type SessaoDoPortal = {
  client?: {
    id?: string;
    name?: string;
    avatar_url?: string | null;
    portal_status?: string | null;
    email?: string | null;
    phone?: string | null;
    whatsapp?: string | null;
    company_name?: string | null;
    document?: string | null;
  } | null;
} | null;

function statusDoCliente(valor: unknown): ClienteLogado["status"] {
  return valor === "pending" || valor === "rejected" ? valor : "approved";
}

/** A sessao do portal do cliente, com favoritos e foto, ou nulo. */
export async function lerClienteLogado(slug: string, token?: string | null): Promise<ClienteLogado | null> {
  try {
    const sessao = token ?? (await cookies()).get(COOKIE_DA_SESSAO)?.value ?? "";
    if (!sessao) return null;
    const admin = createAdminClient();
    const { data } = await admin.rpc("client_portal_get_session", { p_slug: slug, p_session_token: sessao });
    const dados = (data || null) as SessaoDoPortal;
    const id = String(dados?.client?.id || "");
    if (!id) return null;

    let avatar: string | null = String(dados?.client?.avatar_url || "").trim() || null;
    let favoritos: string[] | null = null;
    try {
      const { data: registro } = await admin.from("clients").select("avatar_url, favorites").eq("id", id).maybeSingle();
      const linha = registro as { avatar_url?: string | null; favorites?: unknown } | null;
      if (linha?.avatar_url) avatar = String(linha.avatar_url);
      if (Array.isArray(linha?.favorites)) favoritos = linha.favorites as string[];
    } catch {
      /* Sem a lista, o coracao nasce vazio. */
    }

    return {
      id,
      name: String(dados?.client?.name || ""),
      avatar_url: avatar,
      favorites: favoritos,
      status: statusDoCliente(dados?.client?.portal_status),
      email: dados?.client?.email ?? null,
      phone: dados?.client?.phone ?? null,
      whatsapp: dados?.client?.whatsapp ?? null,
      company_name: dados?.client?.company_name ?? null,
      document: dados?.client?.document ?? null,
    };
  } catch {
    return null;
  }
}

/** O navegador e da equipe desta loja? (cookie que o painel grava) */
export async function navegadorDaEquipe(lojaId: string | null | undefined): Promise<boolean> {
  try {
    const valor = (await cookies()).get(COOKIE_DA_EQUIPE)?.value;
    return navegadorEhDaEquipe(valor, lojaId);
  } catch {
    return false;
  }
}

export type VisaoDaPagina = {
  visao: VisaoDoVisitante;
  cliente: ClienteLogado | null;
};

/** A visao completa de quem esta olhando esta loja, calculada a cada requisicao. */
export async function lerVisaoDaLoja(
  slug: string,
  perfil: Record<string, unknown> | null | undefined
): Promise<VisaoDaPagina> {
  const [cliente, equipe] = await Promise.all([lerClienteLogado(slug), navegadorDaEquipe(String(perfil?.id || ""))]);
  const clienteDaVisao: ClienteDaVisao = cliente ? { id: cliente.id, name: cliente.name, status: cliente.status } : null;
  return { visao: resolverVisao(perfil, clienteDaVisao, equipe), cliente };
}

/** O cliente logado no formato que StoreContent e o Vendor ja recebem. */
export function clienteParaAsTelas(cliente: ClienteLogado | null) {
  if (!cliente) return null;
  return { id: cliente.id, name: cliente.name, avatar_url: cliente.avatar_url, favorites: cliente.favorites };
}

/** O endereco de login da loja com a volta para onde a pessoa estava. */
export function enderecoDeLogin(slug: string, destino: string) {
  const caminho = destino.startsWith("/") ? destino : `/${destino}`;
  return `/${slug}/cliente/login?next=${encodeURIComponent(caminho)}`;
}
