"""
Image compression configuration loader
Loads compression levels from YAML configuration file
"""
import yaml
from pathlib import Path
from typing import Dict, Any, Optional


class ImageCompressionConfig:
    """Manages image compression configuration from YAML file"""

    def __init__(self, config_path: Optional[str] = None):
        """
        Initialize configuration loader

        Args:
            config_path: Path to YAML config file (optional)
        """
        if config_path is None:
            # Default path: config/image_compression.yaml (from project root)
            # Path from backend/app/utils/ -> up 3 levels to project root
            config_path = Path(__file__).parent.parent.parent.parent / "config" / "image_compression.yaml"

        self.config_path = Path(config_path)
        self.config = self._load_config()

    def _load_config(self) -> Dict[str, Any]:
        """Load configuration from YAML file"""
        if not self.config_path.exists():
            print(f"Warning: Image compression config not found at {self.config_path}")
            print("Using default configuration")
            return self._get_default_config()

        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                config = yaml.safe_load(f)
                return config
        except Exception as e:
            print(f"Error loading image compression config: {e}")
            print("Using default configuration")
            return self._get_default_config()

    def _get_default_config(self) -> Dict[str, Any]:
        """Get default configuration if YAML file not found"""
        return {
            "default_level": "medium",
            "levels": {
                "medium": {
                    "enabled": True,
                    "quality": 85,
                    "max_width": 1920,
                    "max_height": 1080,
                    "thumbnail_size": 48,
                    "thumbnail_quality": 75,
                    "thumbnail_format": "webp",
                    "description": "Qualité moyenne - Usage général"
                }
            },
            "supported_formats": ["jpg", "jpeg", "png", "webp", "gif", "bmp"],
            "max_upload_size": 52428800,
            "auto_convert_to_webp": True,
            "keep_original": False,
            "compressed_prefix": "compressed_",
            "thumbnail_prefix": "thumb_"
        }

    def get_level(self, level_name: Optional[str] = None) -> Dict[str, Any]:
        """
        Get compression settings for a specific level

        Args:
            level_name: Name of compression level (high, medium, low, minimal)
                       If None, uses default level

        Returns:
            Dictionary with compression settings
        """
        if level_name is None:
            level_name = self.config.get("default_level", "medium")

        levels = self.config.get("levels", {})
        if level_name not in levels:
            print(f"Warning: Level '{level_name}' not found, using default")
            level_name = self.config.get("default_level", "medium")

        return levels.get(level_name, levels.get("medium", {}))

    def get_all_levels(self) -> Dict[str, Dict[str, Any]]:
        """Get all available compression levels"""
        return self.config.get("levels", {})

    def get_default_level_name(self) -> str:
        """Get name of default compression level"""
        return self.config.get("default_level", "medium")

    def is_format_supported(self, format: str) -> bool:
        """Check if image format is supported for input"""
        supported = self.config.get("supported_input_formats", ["jpg", "jpeg", "png", "webp"])
        return format.lower() in supported

    def get_output_format(self) -> str:
        """Get output format for resized images"""
        return self.config.get("output_format", "png")

    def get_folders(self) -> Dict[str, str]:
        """Get folder structure configuration"""
        return self.config.get("folders", {
            "original": "original",
            "thumbnail": "thumbnail"
        })

    def get_max_upload_size(self) -> int:
        """Get maximum upload size in bytes"""
        return self.config.get("max_upload_size", 52428800)

    def should_keep_original(self) -> bool:
        """Check if original file should be kept"""
        return self.config.get("keep_original", True)

    def get_compressed_prefix(self) -> str:
        """Get prefix for compressed files"""
        return self.config.get("compressed_prefix", "")

    def get_thumbnail_prefix(self) -> str:
        """Get prefix for thumbnail files"""
        return self.config.get("thumbnail_prefix", "thumb_")


# Global instance
image_compression_config = ImageCompressionConfig()
