/* ============================================================
 * Copyright (c) 2026 RAVAPI Soluções. www.ravapi.com
 * Validação de assets (logo, assinatura) — puro, sem I/O
 *
 * Separado do storage de propósito: a regra "que arquivo é aceitável"
 * não muda com o provedor (docs/decisoes.md §16: S3-compatible). Testar
 * isto não deveria exigir bucket nenhum.
 * ============================================================ */

import { DadosInvalidos } from './errors.ts';

export const MIME_PERMITIDOS_LOGO = ['image/png', 'image/jpeg', 'image/webp'] as const;
export const TAMANHO_MAXIMO_LOGO_BYTES = 2 * 1024 * 1024; // 2 MB — logo impresso, não banner

const EXTENSAO_POR_MIME: Record<string, string> = {
  'image/png': 'png',
  'image/jpeg': 'jpg',
  'image/webp': 'webp',
};

export function validarLogo(mime: string, tamanhoBytes: number): void {
  if (!(MIME_PERMITIDOS_LOGO as readonly string[]).includes(mime)) {
    throw new DadosInvalidos(
      `Formato de imagem não aceito para logo: "${mime}". Use PNG, JPEG ou WebP.`,
    );
  }
  if (tamanhoBytes <= 0) {
    throw new DadosInvalidos('Arquivo de logo vazio.');
  }
  if (tamanhoBytes > TAMANHO_MAXIMO_LOGO_BYTES) {
    throw new DadosInvalidos(
      `Logo maior que o limite de ${TAMANHO_MAXIMO_LOGO_BYTES / (1024 * 1024)} MB.`,
    );
  }
}

/** Extensão de arquivo a partir do MIME — só para a chave ficar legível no bucket. */
export function extensaoPara(mime: string): string {
  return EXTENSAO_POR_MIME[mime] ?? 'bin';
}
