import { describe, expect, it } from 'vitest'
import { detectMimeFromMagicBytes } from './magic-bytes'

const JPEG_HEADER = new Uint8Array([0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46])
const PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00])
const GIF_HEADER = new Uint8Array([0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00])
const WEBP_HEADER = new Uint8Array([
  0x52, 0x49, 0x46, 0x46, 0x24, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50,
])
const AVIF_AVIF_BRAND = new Uint8Array([
  0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66,
  0x00, 0x00, 0x00, 0x00, 0x61, 0x76, 0x69, 0x66,
])
const AVIF_AVIS_BRAND = new Uint8Array([
  0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x73,
  0x00, 0x00, 0x00, 0x00, 0x61, 0x76, 0x69, 0x73,
])
const BARE_FTYP = new Uint8Array([
  0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34, 0x32,
  0x00, 0x00, 0x00, 0x00, 0x6d, 0x70, 0x34, 0x31,
])

describe('@platform-modules/uploads/magic-bytes', () => {
  it('accepts real JPEG/PNG/WebP/AVIF/GIF headers', () => {
    expect(detectMimeFromMagicBytes(JPEG_HEADER)).toBe('image/jpeg')
    expect(detectMimeFromMagicBytes(PNG_HEADER)).toBe('image/png')
    expect(detectMimeFromMagicBytes(WEBP_HEADER)).toBe('image/webp')
    expect(detectMimeFromMagicBytes(GIF_HEADER)).toBe('image/gif')
    expect(detectMimeFromMagicBytes(AVIF_AVIF_BRAND)).toBe('image/avif')
    expect(detectMimeFromMagicBytes(AVIF_AVIS_BRAND)).toBe('image/avif')
  })

  it('rejects spoofed content-type bytes (PNG bytes are not JPEG)', () => {
    expect(detectMimeFromMagicBytes(PNG_HEADER)).not.toBe('image/jpeg')
  })

  it('rejects SVG/HTML/script/XML text headers', () => {
    expect(detectMimeFromMagicBytes(new TextEncoder().encode('<svg xmlns="http://www.w3.org/2000/svg"></svg>'))).toBeNull()
    expect(detectMimeFromMagicBytes(new TextEncoder().encode('<html><body>x</body></html>'))).toBeNull()
    expect(detectMimeFromMagicBytes(new TextEncoder().encode('<script>alert(1)</script>'))).toBeNull()
    expect(detectMimeFromMagicBytes(new TextEncoder().encode('<?xml version="1.0"?><root/>'))).toBeNull()
  })

  it('rejects bare-ftyp AVIF (trance loose-bug regression)', () => {
    expect(detectMimeFromMagicBytes(BARE_FTYP)).toBeNull()
  })

  it('accepts avif/avis brands only', () => {
    expect(detectMimeFromMagicBytes(AVIF_AVIF_BRAND)).toBe('image/avif')
    expect(detectMimeFromMagicBytes(AVIF_AVIS_BRAND)).toBe('image/avif')
  })
})
