from abc import ABC, abstractmethod
from typing import List, Dict, Any, Optional
from fastapi import UploadFile

class StorageInterface(ABC):
    @abstractmethod
    async def save_files(self, folder_path: str, files: List[UploadFile]) -> Dict[str, Any]:
        """Guarda archivos en el storage y retorna información de los archivos subidos"""
        pass
    
    @abstractmethod
    async def get_file_url(self, file_path: str) -> str:
        """Obtiene la URL pública de un archivo"""
        pass
    
    @abstractmethod
    async def delete_file(self, file_path: str) -> bool:
        """Elimina un archivo del storage"""
        pass
    
    @abstractmethod
    async def list_files(self, folder_path: str) -> List[str]:
        """Lista todos los archivos en una carpeta"""
        pass
    
    @abstractmethod
    async def list_files_with_metadata(self, folder_path: str, max_files: int = 5) -> Dict[str, Any]:
        """Lista archivos con metadatos (sin generar URLs firmadas)"""
        pass
    
    @abstractmethod
    async def get_signed_url(self, s3_key: str, expiration: int = 300) -> Dict[str, Any]:
        """Genera una URL firmada para un archivo específico"""
        pass
