import 'package:flutter/widgets.dart';

import 'package:go_router/go_router.dart';
import 'package:together_mobile/database/hive_database.dart';

import 'router_key.dart';
import 'chat_router.dart';
import 'contact_router.dart';
import 'more_router.dart';
import 'package:together_mobile/models/init_get_it.dart';
import 'package:together_mobile/models/token_model.dart';
import 'package:together_mobile/models/user_model.dart';
import 'package:together_mobile/request/signup_signin.dart';
import 'package:together_mobile/screens/signin_signup/signup_screen.dart';
import 'package:together_mobile/screens/signin_signup/signin_screen.dart';
import 'package:together_mobile/screens/welcome/welcome_screen.dart';
import 'package:together_mobile/screens/home/home_screen.dart';
import 'package:together_mobile/notification_api.dart';

// Used to listen the page transition
// https://blog.csdn.net/sinat_17775997/article/details/106570011#:~:text=Flutter%E7%9B%91%E5%90%AC%E8%B7%AF%E7%94%B1%E8%BF%94%E5%9B%9E%20%E6%96%B9%E6%B3%95%E4%B8%80%EF%BC%9A,push%E6%96%B9%E6%B3%95.then%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%8B%E5%8A%BF%E8%BF%94%E5%9B%9E%E2%9C%85%EF%BC%8C%E5%8F%AF%E4%BB%A5%E8%8E%B7%E5%8F%96%E4%BC%A0%E5%9B%9E%E5%8F%82%E6%95%B0%E2%9C%85%E3%80%82%20%E6%96%B9%E6%B3%95%E4%BA%8C%EF%BC%9A%20didPopNext%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%8B%E5%8A%BF%E8%BF%94%E5%9B%9E%E2%9C%85%EF%BC%8C%E4%BD%86%E5%9B%9E%E4%BC%A0%E5%8F%82%E6%95%B0%E8%8E%B7%E5%8F%96%E4%B8%8D%E5%88%B0%E2%9D%8C%E3%80%82
// final RouteObserver<ModalRoute<void>> routeObserver =
//     RouteObserver<ModalRoute<void>>();

final GoRouter router = GoRouter(
  initialLocation: '/welcome',
  navigatorKey: rootNavigatorKey,
  debugLogDiagnostics: true,
  routes: <RouteBase>[
    GoRoute(
      path: '/welcome',
      name: 'Welcome',
      builder: (BuildContext context, GoRouterState state) =>
          const WelcomeScreen(),
      redirect: (context, state) async {
        await getIt.get<Token>().init();
        if (getIt.get<Token>().token.isNotEmpty) {
          Map<String, dynamic> res = await signinByToken();
          if (res['code'] == 10200) {
            await getIt.get<Token>().updateToken(res['token']);
            getIt.get<UserAccount>().init(res['data']);
            await HiveDatabase.init();
            return '/chat';
          }
        }
        return null;
      },
    ),
    GoRoute(
      path: '/signup',
      name: 'SignUp',
      pageBuilder: (context, state) {
        return CustomTransitionPage(
          key: state.pageKey,
          child: const SignupScreen(),
          transitionDuration: const Duration(milliseconds: 200),
          reverseTransitionDuration: const Duration(milliseconds: 200),
          transitionsBuilder: (BuildContext context,
              Animation<double> animation,
              Animation<double> secondaryAnimation,
              Widget child) {
            const begin = Offset(1.0, 0.0);
            const end = Offset.zero;
            final tween = Tween(begin: begin, end: end);
            final offsetAnimation = animation.drive(tween);
            return SlideTransition(
              position: offsetAnimation,
              child: child,
            );
          },
        );
      },
    ),
    GoRoute(
      path: '/signin',
      name: 'SignIn',
      pageBuilder: (context, state) {
        return CustomTransitionPage(
          key: state.pageKey,
          child: const SigninScreen(),
          transitionDuration: const Duration(milliseconds: 200),
          reverseTransitionDuration: const Duration(milliseconds: 200),
          transitionsBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child,
          ) {
            const begin = Offset(1.0, 0.0);
            const end = Offset.zero;
            final tween = Tween(begin: begin, end: end);
            final offsetAnimation = animation.drive(tween);
            return SlideTransition(
              position: offsetAnimation,
              child: child,
            );
          },
        );
      },
    ),
    ShellRoute(
      navigatorKey: shellNavigatorKey,
      builder: (BuildContext context, GoRouterState state, Widget child) {
        int initIndex = 0;
        if (state.fullPath!.startsWith('/chat')) {
          initIndex = 0;
        } else if (state.fullPath!.startsWith('/contact')) {
          initIndex = 1;
        } else if (state.fullPath!.startsWith('/more')) {
          initIndex = 2;
        }
        return HomeScreenWithNavBar(
          notificationAppLaunchDetails:
              NotificationAPI.notificationAppLaunchDetails,
          initIndex: initIndex,
          child: child,
        );
      },
      routes: <RouteBase>[
        chatRouter,
        contactRouter,
        moreRouter,
      ],
    ),
  ],
);