import { writeFileSync } from 'fs';

/**
 * Crée un fichier MP3 simulé pour les tests
 * Utilise un buffer MP3 valide (frame MP3 avec silence) pour que le backend
 * puisse extraire les métadonnées (durée, etc.) sans bloquer
 */
export function createMockMP3File(filePath: string): void {
  // Petit buffer représentant une frame MP3 valide (silence)
  // Ce buffer contient des headers MP3 valides et des métadonnées ID3
  // qui permettront au backend d'extraire les informations nécessaires
  const validMp3Buffer = Buffer.from(
    '//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD//OEAAAAAAAAAAAAAAAAAAAAAAAATGF2YzU4LjU0AAAAAAAAAAAAAAAAJAAAAAAAAAAAASAAAAAAAASAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAALAAA',
    'base64',
  );
  
  writeFileSync(filePath, validMp3Buffer);
}

/**
 * Crée un buffer MP3 valide pour les tests d'upload
 * Utilisé avec setInputFiles() dans Playwright
 */
export function createMockMP3Buffer(): Buffer {
  // Buffer MP3 valide minimal (Header ID3 + Frame Silence)
  return Buffer.from(
    '4944330300000000000a544954320000000500000054657374fffb90440000000000000000000000000000000000000000',
    'hex',
  );
}

/**
 * Crée un fichier MP3 plus volumineux pour tester le chunked upload
 * @param filePath - Chemin où créer le fichier
 * @param sizeInMB - Taille du fichier en MB (défaut: 15 MB)
 */
export function createLargeMockMP3File(filePath: string, sizeInMB: number = 15): void {
  const sizeInBytes = sizeInMB * 1024 * 1024;
  const baseBuffer = createMockMP3Buffer();
  
  // Répéter le buffer pour atteindre la taille désirée
  const chunks = Math.ceil(sizeInBytes / baseBuffer.length);
  const buffers: Buffer[] = [];
  
  for (let i = 0; i < chunks; i++) {
    buffers.push(baseBuffer);
  }
  
  const largeBuffer = Buffer.concat(buffers).slice(0, sizeInBytes);
  writeFileSync(filePath, largeBuffer);
}

/**
 * Crée un buffer MP3 large pour les tests d'upload chunké (in-memory)
 * Utilisé avec setInputFiles() dans Playwright pour les gros fichiers
 * 
 * @param sizeInMB - Taille du fichier en MB (défaut: 15 MB)
 * @returns Buffer - Buffer MP3 valide de la taille spécifiée
 * 
 * @example
 * const largeBuffer = createLargeMockMP3Buffer(20); // 20 MB
 * await fileInput.setInputFiles({
 *   name: 'large-track.mp3',
 *   mimeType: 'audio/mpeg',
 *   buffer: largeBuffer,
 * });
 */
export function createLargeMockMP3Buffer(sizeInMB: number = 15): Buffer {
  const sizeInBytes = sizeInMB * 1024 * 1024;
  const baseBuffer = createMockMP3Buffer();
  
  // Répéter le buffer pour atteindre la taille désirée
  const chunks = Math.ceil(sizeInBytes / baseBuffer.length);
  const buffers: Buffer[] = [];
  
  for (let i = 0; i < chunks; i++) {
    buffers.push(baseBuffer);
  }
  
  const largeBuffer = Buffer.concat(buffers).slice(0, sizeInBytes);
  return largeBuffer;
}

/**
 * Formats de fichiers audio supportés pour les tests
 */
export const SUPPORTED_AUDIO_FORMATS = {
  mp3: {
    mimeType: 'audio/mpeg',
    extension: '.mp3',
  },
  flac: {
    mimeType: 'audio/flac',
    extension: '.flac',
  },
  wav: {
    mimeType: 'audio/wav',
    extension: '.wav',
  },
  ogg: {
    mimeType: 'audio/ogg',
    extension: '.ogg',
  },
  m4a: {
    mimeType: 'audio/mp4',
    extension: '.m4a',
  },
  aac: {
    mimeType: 'audio/aac',
    extension: '.aac',
  },
} as const;
