/**
 * 파일 다운로드 유틸리티
 *
 * 백엔드 API: GET /api/v1/files/{id}/download
 * 프록시: GET /api/proxy/files/{id}/download
 */

import { downloadBlob } from './export';

/**
 * Content-Disposition 헤더에서 파일명 추출
 */
function extractFilenameFromHeader(response: Response): string | null {
  const contentDisposition = response.headers.get('Content-Disposition');
  if (!contentDisposition) return null;

  const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
  if (!match?.[1]) return null;

  const raw = match[1].replace(/['"]/g, '');
  try {
    return decodeURIComponent(raw);
  } catch {
    return raw;
  }
}

/**
 * 파일 ID로 다운로드
 * @param fileId 파일 ID
 * @param fileName 저장할 파일명 (선택, 없으면 서버에서 제공하는 이름 사용)
 */
export async function downloadFileById(fileId: number, fileName?: string): Promise<void> {
  try {
    const response = await fetch(`/api/proxy/files/${fileId}/download`);

    if (!response.ok) {
      throw new Error(`다운로드 실패: ${response.status}`);
    }

    const blob = await response.blob();
    const downloadFileName = fileName
      ?? extractFilenameFromHeader(response)
      ?? `file_${fileId}`;

    downloadBlob(blob, downloadFileName);
  } catch (error) {
    console.error('[fileDownload] 다운로드 오류:', error);
    throw error;
  }
}

/**
 * 파일 ID로 새 탭에서 열기 (인라인 미리보기)
 * R2 스토리지 전환으로 /storage/ 직접 접근 불가 → /view 엔드포인트 사용
 * @param fileId 파일 ID
 */
export function openFileInNewTab(fileId: number): void {
  window.open(`/api/proxy/files/${fileId}/view`, '_blank');
}