"""Base provider interface for video generation."""
from abc import ABC, abstractmethod
from typing import Optional, Dict, Any
from pathlib import Path


class VideoProvider(ABC):
    """Abstract base class for video generation providers."""
    
    def __init__(self, name: str):
        """Initialize provider.
        
        Args:
            name: Provider name
        """
        self.name = name
    
    @abstractmethod
    async def generate(
        self,
        prompt: str,
        duration: int,
        resolution: str = "1080p",
        fps: int = 30,
        style: Optional[str] = None,
        **kwargs
    ) -> Dict[str, Any]:
        """Generate video from text prompt.
        
        Args:
            prompt: Text description
            duration: Duration in seconds
            resolution: Video resolution (480p, 720p, 1080p, 4k)
            fps: Frames per second
            style: Visual style
            **kwargs: Additional provider-specific parameters
            
        Returns:
            Dictionary with video metadata and file path
        """
        pass
    
    @abstractmethod
    async def generate_with_audio(
        self,
        prompt: str,
        audio_file: str,
        resolution: str = "1080p",
        fps: int = 30,
        style: Optional[str] = None,
        **kwargs
    ) -> Dict[str, Any]:
        """Generate video synchronized with audio.
        
        Args:
            prompt: Text description
            audio_file: Path to audio file
            resolution: Video resolution
            fps: Frames per second
            style: Visual style
            **kwargs: Additional parameters
            
        Returns:
            Dictionary with video metadata and file path
        """
        pass
    
    @abstractmethod
    async def check_status(self, job_id: str) -> Dict[str, Any]:
        """Check generation job status.
        
        Args:
            job_id: Job identifier
            
        Returns:
            Status information
        """
        pass
    
    def get_resolution_dimensions(self, resolution: str) -> tuple:
        """Get width and height for resolution string.
        
        Args:
            resolution: Resolution string (480p, 720p, 1080p, 4k)
            
        Returns:
            Tuple of (width, height)
        """
        resolution_map = {
            "480p": (854, 480),
            "720p": (1280, 720),
            "1080p": (1920, 1080),
            "4k": (3840, 2160),
            "16:9": (1920, 1080),  # Default to 1080p
            "9:16": (1080, 1920),  # Vertical for TikTok/Instagram
            "1:1": (1080, 1080),   # Square for Instagram
        }
        return resolution_map.get(resolution.lower(), (1920, 1080))
