// 스토리지 추상화 공용 타입 — 구현체(NCP Object Storage 등)와 호출부가 공유한다.

// Presigned 업로드 발급 입력
export interface PresignUploadInput {
  // 버킷 내 객체 키 (예: development/drive/{userId}/{uuid}-name.pdf)
  key: string;
  // 업로드 시 강제할 MIME 타입 — 서명에 포함되어 클라이언트가 다른 타입으로 못 올림
  contentType: string;
  // URL 유효 시간(초). 미지정 시 구현체 기본값
  expiresInSeconds?: number;
}

// Presigned 업로드 발급 결과
export interface PresignedUpload {
  // 클라이언트가 직접 PUT 할 URL
  url: string;
  // HTTP 메서드 (PUT 고정)
  method: 'PUT';
  // 업로드 요청 시 반드시 포함해야 하는 헤더(서명 대상) — 예: { 'Content-Type': '...' }
  headers: Record<string, string>;
  // 만료 시각(클라이언트 표시/검증용)
  expiresAt: Date;
}

// Presigned 다운로드 발급 입력
export interface PresignDownloadInput {
  key: string;
  // 다운로드 시 표시할 원본 파일명(Content-Disposition 에 반영)
  filename: string;
  // 응답 Content-Type
  contentType: string;
  // URL 유효 시간(초). 미지정 시 구현체 기본값
  expiresInSeconds?: number;
}

// HEAD 조회 결과 — 업로드 완료 검증(실제 size/type 재확인)에 사용
export interface ObjectHead {
  // 실제 저장된 바이트 크기
  size: number;
  // 실제 저장된 MIME 타입(없을 수 있음)
  contentType: string | null;
}
