/**
 * Vue插件模块
 * 提供Vue应用中使用统一登录SDK的能力
 */

import { Auth } from '../core/auth';
import { SDKConfig, UnifiedLoginSDK } from '../types';
import { Storage } from '../utils/storage';
import { RouterGuard } from '../guards/router';

/**
 * Vue版本类型
 */
type VueVersion = 'vue2' | 'vue3';

/**
 * Vue插件选项
 */
export interface VuePluginOptions {
  /**
   * SDK配置
   */
  config: SDKConfig;
  /**
   * 插件名称，默认'unifiedLogin'
   */
  pluginName?: string;
}

/**
 * Vue插件类
 */
export class VuePlugin {
  private readonly auth: Auth;
  private readonly routerGuard: RouterGuard;
  private readonly storage: Storage;

  /**
   * 构造函数
   * @param storage 存储实例
   */
  constructor(storage: Storage) {
    if (!storage) {
      throw new Error('Storage instance is required');
    }
    
    this.storage = storage;
    this.auth = new Auth(storage);
    this.routerGuard = new RouterGuard(this.auth);
  }

  /**
   * 安装Vue插件
   * @param app Vue构造函数或Vue 3应用实例
   * @param options 插件选项
   */
  install(app: any, options: VuePluginOptions): void {
    const { config, pluginName = 'unifiedLogin' } = options;

    // 初始化SDK
    this.auth.init(config);

    // 判断是Vue 2还是Vue 3
    const isVue3 = typeof app.config !== 'undefined';

    if (isVue3) {
      // Vue 3
      // 在全局属性上挂载SDK实例
      app.config.globalProperties[`${pluginName}`] = this.auth;
      app.config.globalProperties.$auth = this.auth; // 兼容简写

      // 提供Vue组件内的注入
      app.provide(pluginName, this.auth);
      app.provide('auth', this.auth); // 兼容简写

      // 处理路由守卫
      app.mixin({
        beforeCreate() {
          // 如果是根组件，添加路由守卫
          if (this.$options.router) {
            const router = this.$options.router;
            // 添加全局前置守卫
            router.beforeEach(this.routerGuard.createVueGuard());
          }
        }
      });
    } else {
      // Vue 2
      // 在Vue实例上挂载SDK实例
      app.prototype[`${pluginName}`] = this.auth;
      app.prototype.$auth = this.auth; // 兼容简写

      // 全局混入
      app.mixin({
        beforeCreate() {
          // 如果是根组件，添加路由守卫
          if (this.$options.router) {
            const router = this.$options.router;
            // 添加全局前置守卫
            router.beforeEach(this.routerGuard.createVueGuard());
          }
        }
      });
    }
  }

  /**
   * 获取认证实例
   * @returns Auth 认证实例
   */
  getAuth(): Auth {
    return this.auth;
  }

  /**
   * 获取路由守卫实例
   * @returns RouterGuard 路由守卫实例
   */
  getRouterGuard(): RouterGuard {
    return this.routerGuard;
  }

  /**
   * 获取存储实例
   * @returns Storage 存储实例
   */
  getStorage(): Storage {
    return this.storage;
  }

  /**
   * 获取SDK实例（兼容旧版本）
   * @returns UnifiedLoginSDK SDK实例
   */
  getSDK(): UnifiedLoginSDK {
    return this.auth as unknown as UnifiedLoginSDK;
  }
}

/**
 * 创建Vue插件实例
 * @param storageType 存储类型
 * @param prefix 存储前缀
 * @returns VuePlugin Vue插件实例
 */
export function createVuePlugin(
  storageType?: 'localStorage' | 'sessionStorage' | 'cookie',
  prefix?: string
): VuePlugin {
  const storage = new Storage(storageType, prefix);
  return new VuePlugin(storage);
}

/**
 * 创建Vue 3 Composition API使用的composable函数
 * @param plugin Vue插件实例
 * @returns composable函数
 */
export function useAuth(plugin: VuePlugin) {
  return {
    /** 认证实例 */
    auth: plugin.getAuth(),
    /** 路由守卫实例 */
    routerGuard: plugin.getRouterGuard(),
    /** 存储实例 */
    storage: plugin.getStorage(),
    /** SDK实例 */
    sdk: plugin.getSDK()
  };
}

// 全局类型声明（可根据需要在项目中添加）
// declare module '@vue/runtime-core' {
//   interface ComponentCustomProperties {
//     $unifiedLogin: Auth;
//     $auth: Auth;
//   }
// }
//
// declare module 'vue/types/vue' {
//   interface Vue {
//     $unifiedLogin: Auth;
//     $auth: Auth;
//   }
// }
