import { NextResponse } from "next/server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { createAdminClient, createClient } from "@/lib/supabase-server";
import { BUCKET_PRIVADO_DA_CONVERSA } from "@/lib/chats/servidor";

/*
  Anexo da conversa, lado da equipe.

  O arquivo mora numa pasta privada (migration 161): nao existe endereco
  publico para ele. Quem abre um anexo passa por aqui, a rota confere se a
  pessoa pode ver aquela conversa — as mesmas regras do Chats e da conversa do
  pedido — e devolve um endereco assinado que vale poucos minutos.
*/

export const dynamic = "force-dynamic";

const VALIDADE_DO_ENDERECO_S = 300;

type Mensagem = {
  id: string;
  thread_id: string;
  attachment_path: string | null;
  attachment_name: string | null;
  deleted_at: string | null;
};

type Conversa = {
  id: string;
  user_id: string;
  kind: string;
  order_id: string | null;
  member_a: string | null;
  member_b: string | null;
};

export async function GET(_req: Request, context: { params: Promise<{ id: string }> }) {
  const { id } = await context.params;
  if (!/^[0-9a-f-]{36}$/i.test(String(id || ""))) {
    return NextResponse.json({ error: "Anexo nao encontrado." }, { status: 404 });
  }

  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });

  const admin = createAdminClient();
  const { data: mensagemBruta } = await admin
    .from("chat_messages")
    .select("id,thread_id,attachment_path,attachment_name,deleted_at")
    .eq("id", id)
    .maybeSingle();
  const mensagem = mensagemBruta as Mensagem | null;
  if (!mensagem?.id || !mensagem.attachment_path || mensagem.deleted_at) {
    return NextResponse.json({ error: "Anexo nao encontrado." }, { status: 404 });
  }

  const { data: conversaBruta } = await admin
    .from("chat_threads")
    .select("id,user_id,kind,order_id,member_a,member_b")
    .eq("id", mensagem.thread_id)
    .maybeSingle();
  const conversa = conversaBruta as Conversa | null;
  if (!conversa?.id) return NextResponse.json({ error: "Anexo nao encontrado." }, { status: 404 });

  /* As mesmas portas de quem le a conversa: na da equipe, so quem participa;
     nas da loja, a empresa dona com a permissao do Chats — ou, na conversa do
     pedido, quem pode ver pedidos (e assim que a aba do pedido abre o fio). */
  let pode = false;
  if (conversa.kind === "team") {
    pode = conversa.member_a === user.id || conversa.member_b === user.id;
  } else {
    const ctx = await getCompanyContext(supabase, user);
    const tenantIds = ctx.tenantIds?.length ? ctx.tenantIds : [user.id];
    const daMinhaLoja = tenantIds.includes(conversa.user_id);
    pode =
      daMinhaLoja &&
      (canCompany(ctx, user.id, "chats.read") || (Boolean(conversa.order_id) && canCompany(ctx, user.id, "orders.read")));
  }
  if (!pode) return NextResponse.json({ error: "Sem permissao." }, { status: 403 });

  const { data: assinado, error } = await admin.storage
    .from(BUCKET_PRIVADO_DA_CONVERSA)
    .createSignedUrl(mensagem.attachment_path, VALIDADE_DO_ENDERECO_S);
  if (error || !assinado?.signedUrl) {
    return NextResponse.json({ error: "Nao foi possivel abrir o anexo agora." }, { status: 502 });
  }

  const resposta = NextResponse.redirect(assinado.signedUrl, 302);
  resposta.headers.set("Cache-Control", "private, max-age=240");
  return resposta;
}
