//! Extension pour intégrer le cache de couvertures dans pmoconfig
//!
//! Ce module fournit le trait `CoverCacheConfigExt` qui permet d'ajouter facilement
//! des méthodes de gestion du cache de couvertures à pmoconfig::Config.

use anyhow::Result;
use pmocache::CacheConfigExt;
use pmoconfig::Config;
use std::sync::Arc;

const DEFAULT_COVER_CACHE_DIR: &str = "cache_covers";
const DEFAULT_COVER_CACHE_SIZE: usize = 2000;

/// Trait d'extension pour gérer le cache de couvertures dans pmoconfig.
///
/// Fournit des helpers pour récupérer/définir le répertoire et la taille du
/// cache de couvertures, ainsi qu'une factory `create_cover_cache` prête à
/// l'emploi (conversion WebP activée).
///
/// # Exemple
///
/// ```rust,ignore
/// use pmoconfig::get_config;
/// use pmocovers::CoverCacheConfigExt;
///
/// let config = get_config();
/// let cache = config.create_cover_cache()?;
///
/// // Utiliser le cache
/// let pk = cache.add_from_url("http://example.com/cover.jpg", Some("album:123")).await?;
/// ```
pub trait CoverCacheConfigExt {
    /// Récupère le répertoire du cache de couvertures
    ///
    /// # Returns
    ///
    /// Le chemin absolu du répertoire du cache de couvertures (default: "cache_covers")
    fn get_covers_dir(&self) -> Result<String>;

    /// Définit le répertoire du cache de couvertures
    ///
    /// # Arguments
    ///
    /// * `directory` - Chemin du répertoire (absolu ou relatif au config_dir)
    fn set_covers_dir(&self, directory: String) -> Result<()>;

    /// Récupère la taille maximale du cache de couvertures
    ///
    /// # Returns
    ///
    /// Le nombre maximal d'images dans le cache (default: 2000)
    fn get_covers_size(&self) -> Result<usize>;

    /// Définit la taille maximale du cache de couvertures
    ///
    /// # Arguments
    ///
    /// * `size` - Nombre maximal d'images
    fn set_covers_size(&self, size: usize) -> Result<()>;

    /// Crée une instance du cache de couvertures configurée avec conversion WebP
    ///
    /// Cette méthode factory crée un cache de couvertures en utilisant les paramètres
    /// de configuration (répertoire et taille) et active la conversion WebP
    /// automatique pour toutes les images téléchargées.
    ///
    /// # Returns
    ///
    /// Une instance Arc du cache de couvertures configuré
    ///
    /// # Exemple
    ///
    /// ```rust,ignore
    /// use pmoconfig::get_config;
    /// use pmocovers::CoverCacheConfigExt;
    ///
    /// let config = get_config();
    /// let cache = config.create_cover_cache()?;
    ///
    /// // Le cache est prêt à être utilisé avec conversion WebP automatique
    /// ```
    fn create_cover_cache(&self) -> Result<Arc<crate::Cache>>;
}

impl CoverCacheConfigExt for Config {
    fn get_covers_dir(&self) -> Result<String> {
        self.get_cache_dir("cover_cache", DEFAULT_COVER_CACHE_DIR)
    }

    fn set_covers_dir(&self, directory: String) -> Result<()> {
        self.set_cache_dir("cover_cache", directory)
    }

    fn get_covers_size(&self) -> Result<usize> {
        self.get_cache_size("cover_cache", DEFAULT_COVER_CACHE_SIZE)
    }

    fn set_covers_size(&self, size: usize) -> Result<()> {
        self.set_cache_size("cover_cache", size)
    }

    fn create_cover_cache(&self) -> Result<Arc<crate::Cache>> {
        let dir = self.get_covers_dir()?;
        let size = self.get_covers_size()?;
        Ok(Arc::new(crate::cache::new_cache(&dir, size)?))
    }
}
