const MAGIC_BYTES: { mime: string; bytes: number[] }[] = [
  { mime: 'image/jpeg', bytes: [0xff, 0xd8, 0xff] },
  { mime: 'image/png', bytes: [0x89, 0x50, 0x4e, 0x47] },
  { mime: 'image/gif', bytes: [0x47, 0x49, 0x46] },
  { mime: 'image/webp', bytes: [0x52, 0x49, 0x46, 0x46] },
];

export const ALLOWED_IMAGE_MIMES = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'] as const;

export const MAX_IMAGE_BYTES = 5 * 1024 * 1024; // 5 MB

export const MIME_TO_EXT: Record<(typeof ALLOWED_IMAGE_MIMES)[number], string> = {
  'image/jpeg': '.jpg',
  'image/png': '.png',
  'image/webp': '.webp',
  'image/gif': '.gif',
};

/**
 * Detect MIME type from file magic bytes. Returns null if unrecognized.
 */
export function detectImageMime(buffer: Buffer): string | null {
  for (const { mime, bytes } of MAGIC_BYTES) {
    if (mime === 'image/webp') {
      if (
        buffer.length >= 12 &&
        buffer[0] === 0x52 &&
        buffer[1] === 0x49 &&
        buffer[2] === 0x46 &&
        buffer[3] === 0x46 &&
        buffer[8] === 0x57 &&
        buffer[9] === 0x45 &&
        buffer[10] === 0x42 &&
        buffer[11] === 0x50
      ) {
        return mime;
      }
      continue;
    }

    if (bytes.every((byte, i) => buffer[i] === byte)) {
      return mime;
    }
  }
  return null;
}

/**
 * Validate an uploaded image buffer against allowed types and declared MIME.
 */
export function validateImageUpload(
  buffer: Buffer,
  declaredType: string
): { ok: true; mime: string } | { ok: false; error: string } {
  if (!Buffer.isBuffer(buffer) || buffer.length === 0) {
    return { ok: false, error: 'Keine Datei übermittelt.' };
  }

  if (buffer.length > MAX_IMAGE_BYTES) {
    return { ok: false, error: 'Datei ist zu groß. Maximal 5 MB erlaubt.' };
  }

  if (!ALLOWED_IMAGE_MIMES.includes(declaredType as (typeof ALLOWED_IMAGE_MIMES)[number])) {
    return { ok: false, error: 'Nur Bilder (JPEG, PNG, WebP, GIF) sind erlaubt.' };
  }

  const detected = detectImageMime(buffer);
  if (!detected) {
    return { ok: false, error: 'Dateiinhalt entspricht keinem erlaubten Bildformat.' };
  }

  if (detected !== declaredType && !(detected === 'image/jpeg' && declaredType === 'image/jpg')) {
    return { ok: false, error: 'Dateityp stimmt nicht mit dem Dateiinhalt überein.' };
  }

  return { ok: true, mime: detected };
}
