import { $u, type RequestOptions, initTheme, configProvider } from './libs';
import type { UViewProOptions, Theme } from './types/global';
import { logger } from './libs/util/logger';
import { defaultThemes } from './libs/config/theme-tokens';

declare const uni: {
    [key: string]: any;
    $u?: typeof $u;
    createSelectorQuery: () => any;
    hideLoading: () => void;
    showLoading: (options: any) => void;
    request: (options: RequestOptions) => any;
};

// $u挂载到uni对象上
const install = (app: any, options?: UViewProOptions): void => {
    try {
        if (options) {
            // 配置主题：统一使用 useTheme 的 initTheme 初始化，避免重复初始化
            if (options?.theme) {
                const optTheme = options.theme as any;
                // 1.如果是数组，则为多主题配置
                if (Array.isArray(optTheme)) {
                    initTheme(optTheme);
                } else if (typeof optTheme === 'object' && optTheme.themes) {
                    // 2.如果为对象且有themes，则为多主题配置+设置默认主题
                    initTheme(
                        optTheme.themes,
                        {
                            defaultTheme: optTheme.defaultTheme,
                            defaultDarkMode: optTheme.defaultDarkMode
                        },
                        optTheme.isForce
                    );
                } else {
                    // 3.兼容之前只有一套样式的情况,需要覆盖默认主题，默认系统主题（uviewpro）
                    const defaultTheme = defaultThemes[0];
                    if (defaultTheme) {
                        // 创建新主题对象，用用户的 theme 覆盖默认主题的 color
                        const mergedTheme: Theme = {
                            ...defaultTheme,
                            color: {
                                ...defaultTheme.color,
                                ...optTheme
                            }
                        };
                        // 初始化主题（只包含覆盖后的默认主题）
                        initTheme([mergedTheme], defaultTheme.name);
                    }
                }
            } else {
                // 默认初始化系统主题
                initTheme();
            }
            // 初始化国际化（如果提供 options.locale 或使用内置语言包）
            try {
                // options.locale 可以是 string（默认语言名） | any[]（locale 列表） | { locales: any[], defaultLocale?: string }
                if (options?.locale) {
                    const optLocale: any = options.locale as any;
                    if (typeof optLocale === 'string') {
                        configProvider.initLocales(undefined, optLocale);
                    } else if (Array.isArray(optLocale)) {
                        configProvider.initLocales(optLocale);
                    } else if (optLocale && typeof optLocale === 'object') {
                        configProvider.initLocales(optLocale.locales, optLocale.defaultLocale, optLocale.isForce);
                    } else {
                        configProvider.initLocales();
                    }
                } else {
                    // 无 locale 配置，仍然初始化内置语言包以保证可用
                    configProvider.initLocales();
                }
            } catch (e) {
                console.error('[install locales] Error:', e);
            }
            // 设置调试模式
            logger
                .setDebugMode(options?.log?.debug ?? false)
                .setPrefix(options?.log?.prefix || '')
                .setShowCallerInfo(options?.log?.showCallerInfo ?? true);
        } else {
            // 默认初始化系统主题
            initTheme();
            // 默认初始化内置语言包以保证可用
            configProvider.initLocales();
        }
    } catch (error) {
        console.error('[install options] Error:', error);
    }
    uni.$u = $u;
    // 可扩展更多配置项
    app.config.globalProperties.$u = $u;
};

export default {
    install
};

export * from './libs';

export type { UViewProOptions };
