/**
 * Generic utility functions for handling file responses from API endpoints
 */

/**
 * Extracts filename from Content-Disposition header
 * @param contentDisposition - Content-Disposition header value
 * @returns Filename if found, null otherwise
 */
export const getFilenameFromHeaders = (contentDisposition: string = ''): string | null => {
  const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
  if (match && match[1]) {
    const filename = match[1].replace(/['"]/g, '');

    // Decode URL-encoded characters (e.g., %20 -> space)
    try {
      return decodeURIComponent(filename);
    } catch {
      // If decoding fails, return the original filename
      return filename;
    }
  }
  return null;
};

/**
 * Creates a File object from API response using the filename from headers
 * @param responseData - The response data (blob/arraybuffer/string)
 * @param headers - Response headers object
 * @param fallbackFilename - Filename to use if none provided in headers
 * @returns File object
 */
export const createFileFromApiResponse = (
  responseData: any,
  headers: any,
  fallbackFilename: string
): File => {
  const contentType = headers?.['content-type'] || 'application/octet-stream';
  const contentDisposition = headers?.['content-disposition'] || '';

  const filename = getFilenameFromHeaders(contentDisposition) || fallbackFilename;
  const blob = new Blob([responseData], { type: contentType });

  return new File([blob], filename, { type: contentType });
};
