import type {
  ObjectHead,
  PresignDownloadInput,
  PresignUploadInput,
  PresignedUpload,
} from './storage.types';

// 오브젝트 스토리지 추상 인터페이스.
// abstract class 를 DI 토큰으로 사용한다(NestJS 권장 패턴) — 구현체는 storage.module 에서 주입.
// 바이너리는 백엔드를 거치지 않고 클라이언트가 presigned URL 로 직접 송수신한다.
export abstract class StorageService {
  // 현재 사용 중인 버킷 이름(메타데이터에 함께 저장해 추후 버킷 이전 대비)
  abstract get bucket(): string;

  // 업로드용 presigned URL 발급(PUT). contentType 이 서명에 포함된다.
  abstract presignUpload(input: PresignUploadInput): Promise<PresignedUpload>;

  // 다운로드용 단기 presigned URL 발급(GET). 파일명/타입을 응답 헤더로 강제한다.
  abstract presignDownload(input: PresignDownloadInput): Promise<string>;

  // 객체 메타 조회 — 미존재 시 null. 업로드 완료(complete) 검증에 사용.
  abstract headObject(key: string): Promise<ObjectHead | null>;

  // 객체 삭제(파일/미완료 업로드 정리). 미존재여도 에러 없이 통과.
  abstract deleteObject(key: string): Promise<void>;
}
