import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:plugin_basic/service/config_services_injection.dart';
import 'package:plugin_platform/engine/directory/directory_util.dart';
import 'package:plugin_platform/engine/sp/sp_util.dart';
import 'package:shared/utils/log_utils.dart';

/*
 * Main函数入口的初始化
 */
class AppInitializer {
  // 私有的构造函数，防止实例化
  AppInitializer._();

  /*
   * 1.入口初始化方法 - Platform 插件中的Engine其他功能初始化
   * main.dart 中宿主的配置
   */
  static void initialize() async {
    //FT框架初始化
    WidgetsFlutterBinding.ensureInitialized();

    //初始化SP
    await SPUtil.getInstance();

    //Log框架初始化
    Log.init(isDebug: !kReleaseMode);

    //指定页面的展示方向为哪一种，常用的三种屏幕方向,支持横屏
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      // DeviceOrientation.landscapeLeft,
      // DeviceOrientation.landscapeRight,
    ]);

    //处理显示区域
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]);
  }

  /*
   * 2.延迟初始化，一般是在用户同意隐私权限之后再调用
   * 同意权限之后的其他插件初始化，用于宿主的配置
   */
  static Future<void> delayInitialize({
    List<Future<void> Function()>? futureTasks,
    List<void Function()>? normalTasks,
  }) async {
    // 路径管理工具类 (SD卡，沙盒等路径获取)
    setInitDir(initTempDir: true, initAppDocDir: true, initAppSupportDir: true, initStorageDir: false);

    // 收集所有需要等待的Future
    final List<Future> futures = [
      Future.delayed(const Duration(milliseconds: 1000)), // 默认1秒延时

      DirectoryUtil.getInstance(), // SD卡管控

      ConfigServicesInjection.init(), // 假设这是一个 Future 方法
    ];

    // 如果提供了 futureTasks，调用并添加到 futures 列表
    if (futureTasks != null) {
      for (var task in futureTasks) {
        futures.add(task());
      }
    }

    // 如果提供了 normalTasks，将它们包装成 Future 并添加到 futures 列表
    if (normalTasks != null) {
      for (var task in normalTasks) {
        futures.add(Future(() {
          task();
        }));
      }
    }

    // 等待所有 Future 完成
    await Future.wait(futures);
  }

  /*
   * 3.入口初始化方法 - Platform 插件中的Engine其他功能初始化
   * 独立运行模块中的 main.dart 配置，用于测试
   */
  static Future initializeRunalone() async {
    //FT框架初始化
    WidgetsFlutterBinding.ensureInitialized();

    //初始化SP
    await SPUtil.getInstance();

    //Log框架初始化
    Log.init(isDebug: !kReleaseMode);

    //延迟初始化的插件在独立运行的时候一起初始化了
    setInitDir(initTempDir: true, initAppDocDir: true, initAppSupportDir: true, initStorageDir: false);
    DirectoryUtil.getInstance(); //SD卡管控

    //注入全局单例Service(内部包含 AppInfo，DeviceInfo 等初始化，并注入了 ConfigService 配置服务类)
    await ConfigServicesInjection.init();

    //指定页面的展示方向为哪一种，常用的三种屏幕方向
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      // DeviceOrientation.landscapeLeft,
      // DeviceOrientation.landscapeRight,
    ]);

    //处理显示区域
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
  }
}
