import type { SupabaseClient } from "@supabase/supabase-js";

import { ErroDigital } from "./contexto";

export type ArquivoDoBanco = {
  id: string;
  user_id: string;
  storage_key: string;
  nome: string;
  extensao: string;
  categoria: string;
  tamanho_bytes: number;
  status: string;
  envio_id: string | null;
  tamanho_da_parte: number | null;
  meta: Record<string, unknown> | null;
};

export async function lerArquivoDaLoja(admin: SupabaseClient, lojaId: string, id: string): Promise<ArquivoDoBanco> {
  if (!/^[0-9a-f-]{36}$/i.test(id)) throw new ErroDigital("Arquivo não encontrado.", 404);
  const { data, error } = await admin
    .from("digital_files")
    .select("id,user_id,storage_key,nome,extensao,categoria,tamanho_bytes,status,envio_id,tamanho_da_parte,meta")
    .eq("id", id)
    .eq("user_id", lojaId)
    .maybeSingle();
  if (error) throw new ErroDigital("Não foi possível ler o arquivo.", 500);
  if (!data) throw new ErroDigital("Arquivo não encontrado.", 404);
  return data as ArquivoDoBanco;
}

/* Metadados que o navegador mediu (duração do vídeo, páginas do PDF...).
   Só números conhecidos, dentro da faixa. */
export function metaConferida(bruto: unknown): Record<string, number> {
  const meta: Record<string, number> = {};
  if (!bruto || typeof bruto !== "object" || Array.isArray(bruto)) return meta;
  const o = bruto as Record<string, unknown>;
  const numero = (valor: unknown, maximo: number) =>
    typeof valor === "number" && Number.isFinite(valor) && valor > 0 && valor <= maximo ? Math.round(valor * 100) / 100 : null;
  const duracao = numero(o.duracao, 24 * 3600);
  const largura = numero(o.largura, 20000);
  const altura = numero(o.altura, 20000);
  const paginas = numero(o.paginas, 100000);
  if (duracao) meta.duracao = duracao;
  if (largura) meta.largura = Math.round(largura);
  if (altura) meta.altura = Math.round(altura);
  if (paginas) meta.paginas = Math.round(paginas);
  return meta;
}
