use crate::ae_sys;

use std::{ convert::TryFrom, ffi::CString, marker::PhantomData };
use widestring::U16CString;

#[cfg(feature = "artisan-2-api")]
mod scene_3d;
#[cfg(feature = "artisan-2-api")]
pub use scene_3d::*;

pub mod suites {
    pub(crate) mod camera;               pub use camera              ::CameraSuite             as Camera;
    pub(crate) mod canvas;               pub use canvas              ::CanvasSuite             as Canvas;
    pub(crate) mod color_settings;       pub use color_settings      ::ColorSettingsSuite      as ColorSettings;
    pub(crate) mod command;              pub use command             ::CommandSuite            as Command;
    pub(crate) mod comp;                 pub use comp                ::CompSuite               as Comp;
    pub(crate) mod composite;            pub use composite           ::CompositeSuite          as Composite;
    pub(crate) mod effect;               pub use effect              ::EffectSuite             as Effect;
    pub(crate) mod footage;              pub use footage             ::FootageSuite            as Footage;
    pub(crate) mod io_in;                pub use io_in               ::IOInSuite               as IOIn;
    pub(crate) mod item;                 pub use item                ::ItemSuite               as Item;
    pub(crate) mod keyframe;             pub use keyframe            ::KeyframeSuite           as Keyframe;
    pub(crate) mod layer_render_options; pub use layer_render_options::LayerRenderOptionsSuite as LayerRenderOptions;
    pub(crate) mod layer;                pub use layer               ::LayerSuite              as Layer;
    pub(crate) mod light;                pub use light               ::LightSuite              as Light;
    pub(crate) mod mask;                 pub use mask                ::{ MaskSuite             as Mask,
                                                                         MaskOutlineSuite      as MaskOutline };
    pub(crate) mod memory;               pub use memory              ::MemorySuite             as Memory;
    pub(crate) mod persistent_data;      pub use persistent_data     ::PersistentDataSuite     as PersistentData;
    pub(crate) mod pf_interface;         pub use pf_interface        ::PFInterfaceSuite        as PFInterface;
    pub(crate) mod project;              pub use project             ::ProjectSuite            as Project;
    pub(crate) mod register;             pub use register            ::{ RegisterSuite         as Register,
                                                                         RegisterNonAegpSuite  as RegisterNonAegp };
    pub(crate) mod render_async_manager; pub use render_async_manager::RenderAsyncManagerSuite as RenderAsyncManager;
    pub(crate) mod render_options;       pub use render_options      ::RenderOptionsSuite      as RenderOptions;
    pub(crate) mod render;               pub use render              ::RenderSuite             as Render;
    pub(crate) mod output_module;        pub use output_module       ::OutputModuleSuite       as OutputModule;
    pub(crate) mod render_queue;         pub use render_queue        ::RenderQueueSuite        as RenderQueue;
    pub(crate) mod render_queue_item;    pub use render_queue_item   ::RenderQueueItemSuite    as RenderQueueItem;
    pub(crate) mod sound_data;           pub use sound_data          ::SoundDataSuite          as SoundData;
    pub(crate) mod stream;               pub use stream              ::{ StreamSuite           as Stream,
                                                                         DynamicStreamSuite    as DynamicStream };
    pub(crate) mod utility;              pub use utility             ::UtilitySuite            as Utility;
    pub(crate) mod world;                pub use world               ::WorldSuite              as World;
    pub(crate) mod compute_cache;        pub use compute_cache       ::ComputeCacheSuite       as ComputeCache;
    pub(crate) mod hash;                 pub use hash                ::HashSuite               as Hash;
}

pub type PluginId = ae_sys::AEGP_PluginID;
pub type ItemId = i32;
pub type LayerId = u32;

pub use suites::command::{MenuId, MenuOrder};
pub use suites::register::{HookPriority, CommandHookStatus};
pub use suites::project::{
    ProjectHandle,
    ProjectBitDepth,
};
pub use suites::camera::{
    Camera,
    CameraType,
    FilmSizeUnits,
};
pub use suites::canvas::{
    Canvas,
    BinType,
    DisplayChannel,
    RenderHints,
    RenderLayerContextHandle,
    RenderNumEffects,
    RenderReceiptHandle,
    RenderReceiptStatus,
};
pub use suites::color_settings::{
    ColorProfileHandle,
    ConstColorProfileHandle,
    ItemViewHandle,
};
pub use suites::comp::{
    Composition,
    Collection2Handle,
    CompFlags,
    CompHandle,
};
pub use suites::compute_cache:: {
    ComputeClassId
};
pub use suites::effect::{
    Effect,
    EffectFlags,
    EffectRefHandle,
    InstalledEffectKey,
};
pub use suites::footage::{
    Footage,
    FootageHandle,
    FootageSignature,
    InterpretationStyle,
    Platform,
};
pub use suites::io_in::InputSpecification;
pub use suites::item::{
    Item,
    ItemFlags,
    ItemHandle,
    ItemType,
    LabelId,
};
pub use suites::keyframe::{
    Keyframes,
    AddKeyframesInfoHandle,
    KeyframeFlags,
    KeyframeInterpolation,
    KeyframeInterpolationMask,
};
pub use suites::layer_render_options::{
    LayerRenderOptions,
    LayerRenderOptionsHandle,
    MatteMode
};
pub use suites::layer::{
    Layer,
    LayerFlags,
    LayerHandle,
    LayerQuality,
    LayerSamplingQuality,
    ObjectType,
    TimeMode,
    TrackMatte,
};
pub use suites::light::LightType;
pub use suites::mask::{
    Mask,
    MaskOutline,
    MaskFeatherFalloff,
    MaskFeatherInterp,
    MaskFeatherType,
    MaskMBlur,
    MaskMode,
    MaskOutlineHandle,
    MaskRefHandle,
};
pub use suites::memory::{
    MemHandle,
    MemHandleLock,
};
pub use suites::persistent_data::{
   PersistentType,
   PersistentBlobHandle
};
pub use suites::render_async_manager::AsyncManager;
pub use suites::render_options::{
    RenderOptions,
    RenderOptionsHandle,
    ItemQuality,
    ChannelOrder
};
pub use suites::output_module::{
    EmbeddingType,
    OutputTypes,
    PostRenderAction,
    StretchQuality,
    VideoChannels,
};
pub use suites::render_queue::RenderQueueState;
pub use suites::render_queue_item::{
    LogType,
    OutputModuleRefHandle,
    RenderItemStatus,
    RQItemRefHandle,
};
pub use suites::sound_data::SoundDataHandle;
pub use suites::stream::{
    Stream,
    DynamicStreamFlags,
    LayerStream,
    MaskStream,
    StreamFlags,
    StreamGroupingType,
    StreamReferenceHandle,
    StreamType,
    StreamValue,
    TextDocumentHandle,
};
pub use suites::utility::GetPathTypes;
pub use suites::world::{
    PlatformWorldHandle,
    World,
    WorldHandle,
    WorldType,
};
pub use suites::hash::Guid;
