import * as React from 'react';
import { RouteObject } from 'react-router-dom';

interface AppLifecycleHooks {
    onInstall?: () => Promise<void> | void;
    onActivate?: () => Promise<void> | void;
    onDeactivate?: () => Promise<void> | void;
    onUninstall?: () => Promise<void> | void;
    onUpdate?: (oldVersion: string, newVersion: string) => Promise<void> | void;
}
interface AppNavItem {
    name: string;
    href: string;
    matchPath?: string;
    icon: React.ElementType;
    iconPath?: React.ElementType;
    order?: number;
    visible?: boolean;
    current?: boolean;
}
interface AppPermission {
    id: string;
    name: string;
    description: string;
    required?: boolean;
}
interface AppRouteConfig extends Omit<RouteObject, 'children'> {
    meta?: {
        title?: string;
        requireAuth?: boolean;
        permissions?: string[];
        layout?: 'default' | 'fullscreen' | 'minimal';
        isMicroApp?: boolean;
        appId?: string;
    };
    children?: AppRouteConfig[];
}
interface AppDependency {
    id: string;
    version: string;
    optional?: boolean;
}
interface AppManifest {
    id: string;
    name: string;
    displayName: string;
    version: string;
    description: string;
    author: string;
    homepage?: string;
    keywords?: string[];
    category?: string;
    icon?: string;
    screenshots?: string[];
    dependencies?: AppDependency[];
    permissions?: AppPermission[];
    minSystemVersion?: string;
}
type AppMode = 'wujie' | 'module' | 'auto';
interface AppConfig {
    manifest: AppManifest;
    navigation?: AppNavItem;
    routes?: AppRouteConfig[];
    hooks?: AppLifecycleHooks;
    entry?: () => Promise<React.ComponentType>;
    wujie?: WujieConfig;
    mode?: AppMode;
}
type AppStatus = 'installed' | 'active' | 'inactive' | 'error' | 'uninstalled';
interface AppInstance {
    config: AppConfig;
    status: AppStatus;
    installedAt: Date;
    lastActivatedAt?: Date;
    error?: string;
}
interface IAppRegistry {
    register(config: AppConfig): Promise<boolean>;
    unregister(appId: string): Promise<boolean>;
    activate(appId: string): Promise<boolean>;
    deactivate(appId: string): Promise<boolean>;
    getApp(appId: string): AppInstance | undefined;
    getAllApps(): AppInstance[];
    getActiveApps(): AppInstance[];
    isRegistered(appId: string): boolean;
    isActive(appId: string): boolean;
}
interface AppEvents {
    'app:registered': {
        app: AppInstance;
    };
    'app:unregistered': {
        appId: string;
    };
    'app:activated': {
        app: AppInstance;
    };
    'app:deactivated': {
        app: AppInstance;
    };
    'app:error': {
        app: AppInstance;
        error: string;
    };
}
interface AppContext {
    appId: string;
    registry: IAppRegistry;
    emit: <K extends keyof AppEvents>(event: K, data: AppEvents[K]) => void;
    subscribe: <K extends keyof AppEvents>(event: K, callback: (data: AppEvents[K]) => void) => () => void;
}
interface WujieConfig {
    name?: string;
    url: string;
    props?: Record<string, any>;
    attrs?: Record<string, any>;
    replace?: boolean;
    sync?: boolean;
    prefix?: {
        'prefix-url'?: string;
        'prefix-class'?: string;
    };
    alive?: boolean;
    sandbox?: boolean;
    fetch?: (url: string, options?: any) => Promise<Response>;
    plugins?: Array<{
        htmlLoader?: Function;
        jsLoader?: Function;
        cssLoader?: Function;
    }>;
    beforeLoad?: (appWindow: Window) => void;
    beforeMount?: (appWindow: Window) => void;
    afterMount?: (appWindow: Window) => void;
    beforeUnmount?: (appWindow: Window) => void;
    afterUnmount?: (appWindow: Window) => void;
    activated?: () => void;
    deactivated?: () => void;
}

export type { AppConfig, AppContext, AppDependency, AppEvents, AppInstance, AppLifecycleHooks, AppManifest, AppMode, AppNavItem, AppPermission, AppRouteConfig, AppStatus, IAppRegistry, WujieConfig };
