import { Game } from "../core/Game";
import { PluginManager } from "../core/PluginManager";
export interface Character {
    name: string;
    image?: string | null;
    color?: string;
    emotions?: {
        [key: string]: string;
    };
    position?: {
        x?: number | string;
        y?: number | string;
        width?: number | string;
        height?: number | string;
        scale?: number;
    };
}
export interface LocalizedText {
    [languageCode: string]: string;
}
export interface LanguageConfig {
    code: string;
    name: string;
    flag?: string;
    isDefault?: boolean;
}
export interface Scene {
    id: string;
    background?: string;
    backgroundVideo?: string;
    backgroundType?: 'image' | 'video' | 'gif' | 'auto';
    music?: string;
    characters?: Character[];
    dialogue: DialogueEntry[];
}
export type AnimationType = 'fadeIn' | 'fadeOut' | 'fadeInUp' | 'fadeOutUp' | 'fadeInDown' | 'fadeOutDown' | 'fadeInLeft' | 'fadeOutLeft' | 'fadeInRight' | 'fadeOutRight' | 'slideInUp' | 'slideOutUp' | 'slideInDown' | 'slideOutDown' | 'slideInLeft' | 'slideOutLeft' | 'slideInRight' | 'slideOutRight' | 'zoomIn' | 'zoomOut' | 'zoomInUp' | 'zoomOutUp' | 'zoomInDown' | 'zoomOutDown' | 'zoomInLeft' | 'zoomOutLeft' | 'zoomInRight' | 'zoomOutRight' | 'bounceIn' | 'bounceOut' | 'bounceInUp' | 'bounceOutUp' | 'bounceInDown' | 'bounceOutDown' | 'bounceInLeft' | 'bounceOutLeft' | 'bounceInRight' | 'bounceOutRight';
export interface FadeAnimation {
    enabled: boolean;
    duration?: number;
    backgroundFade?: boolean | {
        enabled: boolean;
        animation?: AnimationType;
        duration?: number;
    };
    characterFade?: boolean | {
        [characterName: string]: boolean | {
            enabled: boolean;
            animation?: AnimationType;
            duration?: number;
        };
    };
}
export interface DialogueEntry {
    character?: string;
    text: string | LocalizedText;
    emotion?: string;
    sprite?: string;
    characterSprite?: {
        [characterName: string]: string | null;
    };
    choices?: Choice[];
    action?: 'jump' | 'end' | 'save' | 'load';
    target?: string;
    delay?: number;
    fadeAnimation?: FadeAnimation;
}
export interface Choice {
    text: string | LocalizedText;
    action: 'jump' | 'end';
    target?: string;
}
export interface GameScript {
    title: string | LocalizedText;
    author?: string;
    version?: string;
    characters: {
        [key: string]: Character;
    };
    scenes: Scene[];
    settings?: GameSettings;
    languages?: LanguageConfig[];
    localization?: {
        ui?: {
            [key: string]: LocalizedText;
        };
        system?: {
            [key: string]: LocalizedText;
        };
    };
}
export interface GameSettings {
    width?: number | string;
    height?: number | string;
    textSpeed?: number;
    autoPlay?: boolean;
    language?: string;
    mainMenu?: MainMenuConfig;
}
export interface MainMenuConfig {
    background?: string;
    backgroundVideo?: string;
    backgroundColor?: string;
    music?: string;
    title?: {
        text?: string | LocalizedText;
        color?: string;
        fontSize?: number;
        fontFamily?: string;
        shadow?: boolean;
        gradient?: string;
        animation?: 'none' | 'fade' | 'slide' | 'glow';
    };
    subtitle?: {
        show?: boolean;
        text?: string | LocalizedText;
        color?: string;
        fontSize?: number;
    };
    buttons?: {
        style?: 'modern' | 'classic' | 'minimal' | 'glass';
        color?: string;
        hoverColor?: string;
        textColor?: string;
        fontSize?: number;
        borderRadius?: number;
        spacing?: number;
        width?: number;
        animation?: 'none' | 'bounce' | 'slide' | 'fade';
    };
    layout?: {
        alignment?: 'left' | 'center' | 'right';
        titlePosition?: 'top' | 'center' | 'bottom';
        buttonsPosition?: 'top' | 'center' | 'bottom';
        padding?: number;
    };
    credits?: CreditsConfig;
    settings?: {
        background?: string;
        backgroundVideo?: string;
        backgroundColor?: string;
    };
    customCSS?: string;
}
export interface CreditsConfig {
    title?: string | LocalizedText;
    sections?: CreditSection[];
    background?: string;
    backgroundVideo?: string;
    backgroundColor?: string;
    music?: string;
    scrollSpeed?: number;
    autoScroll?: boolean;
    style?: CreditStyle;
}
export interface CreditStyle {
    titleColor?: string;
    titleSize?: number;
    sectionTitleColor?: string;
    sectionTitleSize?: number;
    textColor?: string;
    textSize?: number;
    linkColor?: string;
    fontFamily?: string;
    lineHeight?: number;
    spacing?: number;
}
export interface CreditSection {
    title?: string | LocalizedText;
    items: CreditItem[];
    style?: {
        titleColor?: string;
        titleSize?: number;
        spacing?: number;
    };
}
export interface CreditItem {
    role?: string | LocalizedText;
    name: string;
    description?: string | LocalizedText;
    link?: string;
    style?: {
        nameColor?: string;
        roleColor?: string;
        descriptionColor?: string;
    };
}
export interface GameState {
    currentScene: string;
    currentDialogue: number;
    variables: {
        [key: string]: any;
    };
    history: string[];
    savedAt?: Date;
}
export interface GameEvent {
    type: 'dialogue' | 'scene' | 'choice' | 'save' | 'load' | 'end';
    data?: any;
}
export type GameEventHandler = (event: GameEvent) => void;
export interface PluginHookContext {
    game: Game;
    state: GameState;
    scene?: Scene;
    dialogue?: DialogueEntry;
    choice?: Choice;
    slot?: number;
    language?: string;
    volume?: number;
    [key: string]: any;
}
export interface PluginHooks {
    onStart?: (context: PluginHookContext) => void | Promise<void>;
    onEnd?: (context: PluginHookContext) => void | Promise<void>;
    onPause?: (context: PluginHookContext) => void | Promise<void>;
    onResume?: (context: PluginHookContext) => void | Promise<void>;
    onSceneWillStart?: (context: PluginHookContext) => void | Promise<void>;
    onSceneStarted?: (context: PluginHookContext) => void | Promise<void>;
    onSceneWillEnd?: (context: PluginHookContext) => void | Promise<void>;
    onSceneEnded?: (context: PluginHookContext) => void | Promise<void>;
    onDialogueWillDisplay?: (context: PluginHookContext) => void | Promise<void>;
    onDialogueDisplayed?: (context: PluginHookContext) => void | Promise<void>;
    onDialogueWillHide?: (context: PluginHookContext) => void | Promise<void>;
    onDialogueHidden?: (context: PluginHookContext) => void | Promise<void>;
    onChoicesWillDisplay?: (context: PluginHookContext) => void | Promise<void>;
    onChoicesDisplayed?: (context: PluginHookContext) => void | Promise<void>;
    onChoiceSelected?: (context: PluginHookContext) => void | Promise<void>;
    onWillSave?: (context: PluginHookContext) => void | Promise<void>;
    onSaved?: (context: PluginHookContext) => void | Promise<void>;
    onWillLoad?: (context: PluginHookContext) => void | Promise<void>;
    onLoaded?: (context: PluginHookContext) => void | Promise<void>;
    onMusicWillPlay?: (context: PluginHookContext) => void | Promise<void>;
    onMusicPlayed?: (context: PluginHookContext) => void | Promise<void>;
    onMusicWillStop?: (context: PluginHookContext) => void | Promise<void>;
    onMusicStopped?: (context: PluginHookContext) => void | Promise<void>;
    onSoundWillPlay?: (context: PluginHookContext) => void | Promise<void>;
    onSoundPlayed?: (context: PluginHookContext) => void | Promise<void>;
    onVolumeChanged?: (context: PluginHookContext) => void | Promise<void>;
    onLanguageWillChange?: (context: PluginHookContext) => void | Promise<void>;
    onLanguageChanged?: (context: PluginHookContext) => void | Promise<void>;
    onUIWillRender?: (context: PluginHookContext) => void | Promise<void>;
    onUIRendered?: (context: PluginHookContext) => void | Promise<void>;
    onMenuWillShow?: (context: PluginHookContext) => void | Promise<void>;
    onMenuShown?: (context: PluginHookContext) => void | Promise<void>;
    onMenuWillHide?: (context: PluginHookContext) => void | Promise<void>;
    onMenuHidden?: (context: PluginHookContext) => void | Promise<void>;
    onCharacterWillShow?: (context: PluginHookContext) => void | Promise<void>;
    onCharacterShown?: (context: PluginHookContext) => void | Promise<void>;
    onCharacterWillHide?: (context: PluginHookContext) => void | Promise<void>;
    onCharacterHidden?: (context: PluginHookContext) => void | Promise<void>;
    onCustomEvent?: (context: PluginHookContext & {
        eventName: string;
    }) => void | Promise<void>;
}
export interface PluginMetadata {
    name: string;
    version: string;
    author?: string;
    description?: string;
    dependencies?: string[];
    requiredEngineVersion?: string;
    priority?: number;
}
export interface Plugin {
    metadata: PluginMetadata;
    hooks?: PluginHooks;
    initialize?: (game: Game, pluginManager: PluginManager) => void | Promise<void>;
    dispose?: () => void | Promise<void>;
    api?: {
        [key: string]: any;
    };
}
export interface PluginRegistry {
    [pluginName: string]: Plugin;
}
export type PluginEventType = keyof PluginHooks | 'customEvent';
