import 'dart:io';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/material.dart';
import 'package:ustest/Services/DatabaseService.dart';
import 'package:ustest/Services/LocalStorageService.dart';
import 'package:ustest/Services/UserService.dart';
import 'package:ustest/SignInScreen.dart';
import 'package:ustest/MainScreen.dart';
import 'package:get_it/get_it.dart';
import 'package:colorize_logger/colorize_logger.dart';
import 'Services/AutoTestService.dart';
import 'Services/BuildService.dart';
import 'Services/PackageService.dart';
import 'Services/PublishService.dart';
import 'Utilities/PlatformUtils.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

void main() {
  // setup();
  // runApp(const MyApp());
  initialize();
  // runApp(
  //   LoadingProvider(
  //     themeData: LoadingThemeData(),
  //     loadingWidgetBuilder: (ctx, data) {
  //       return Center(
  //         child: SizedBox(
  //           width: 30,
  //           height: 30,
  //           child: Container(
  //             child: CupertinoActivityIndicator(),
  //             color: Colors.blue,
  //           ),
  //         ),
  //       );
  //     },
  //     child: MyApp(),
  //   ),
  // );
}

Future<void> initialize() async {
  try {
    final getIt = GetIt.instance;
    var isWeb = PlatformUtils.isWeb;
    if (isWeb) {
      Logger.client = ColorizeLoggerClient();
      Logger.info('The first log in web');
    } else {
      if (Logger.isReleaseMode()) {
        /// use file
        Directory directory = await getApplicationDocumentsDirectory();
        final currentDate = DateTime.now();
        final fileName =
            '${currentDate.year}-${currentDate.month}-${currentDate.day}-logs.txt';
        Logger.client =
            FileLoggerClient(filePath: '${directory.path}/$fileName');
      } else {
        Logger.client = ColorizeLoggerClient(); //for debug
      }
      Logger.info('The first log in app');

      /// use sentry
      // await SentryFlutter.init(
      //   (options) {
      //     options.dsn = 'https://example@sentry.io/add-your-dsn-here';
      //   },
      // );
      // Logger.client = SentryLoggerClient();
      var dbServcie = new DatabaseService();
      getIt.registerSingleton<DatabaseService>(dbServcie);
      await dbServcie.initialize();
    }

    getIt.registerSingleton<LocalStorageService>(LocalStorageService(isWeb));
    var userService = new UserService();
    getIt.registerSingleton<UserService>(userService);
    getIt.registerSingleton<BuildService>(new BuildService());
    getIt.registerSingleton<PackageService>(new PackageService());
    getIt.registerSingleton<PublishService>(new PublishService());
    getIt.registerSingleton<AutoTestService>(new AutoTestService());
    await userService.UpdateCurrentUserDetail();
    runApp(const MyApp());
  } catch (ex) {
    Logger.error("initialize exception:$ex");
  }
}

class MyApp extends StatelessWidget {
  const MyApp();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('zh'), // Chinese
        Locale('en'), // English
      ],
      routes: {
        '/': (context) => MainScreen(),
        '/signin': (context) => const SignInScreen(),
      },
    );
  }
}