
use crate::*;
use ae_sys::*;

define_suite!(
    /// Premiere Pro loads all the plug-ins, reads the PiPL, and sends PF_Cmd_GLOBAL_SETUP to determine the plug-ins' capabilities.
    /// To save time on future application launches, it saves some of these capabilities in what we call the plug-in cache (the registry on Windows, a Property List file on macOS).
    /// The next time the application is launched, the cached information is used wherever possible, rather than loading the plug-ins.
    ///
    /// If your effect needs to be reloaded each time, there is a way to disable this caching.
    ///
    /// The plug-in can use the PF Cache On Load Suite to call [`set_no_cache_on_load()`](Self::set_no_cache_on_load) during [`Command::GlobalSetup`].
    CacheOnLoadSuite,
    PF_CacheOnLoadSuite1,
    kPFCacheOnLoadSuite,
    kPFCacheOnLoadSuiteVersion1
);

impl CacheOnLoadSuite {
    /// Acquire this suite from the host. Returns error if the suite is not available.
    /// Suite is released on drop.
    pub fn new() -> Result<Self, Error> {
        crate::Suite::new()
    }

    /// Pass a non-zero value if you want your effect to show up in the UI.
    /// Pass zero if loading failed, but you still want Premiere Pro to attempt to load it again on the next relaunch.
    pub fn set_no_cache_on_load(&self, effect_ref: impl AsPtr<PF_ProgPtr>, effect_available: bool) -> Result<(), Error> {
        call_suite_fn!(self, PF_SetNoCacheOnLoad, effect_ref.as_ptr(), effect_available as _)
    }
}
