import 'package:comwell_key_app/presentation/navigation/transitions/slide_in_transition.dart';
import 'package:comwell_key_app/presentation/navigation/transitions/slide_up_transition.dart';
import 'package:comwell_key_app/presentation/screens/onboarding/usage_tracking/usage_tracking_permission_cubit.dart';
import 'package:comwell_key_app/presentation/screens/onboarding/usage_tracking/usage_tracking_permission_screen.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';

import 'bluetooth/bluetooth_permission_cubit.dart';
import 'bluetooth/bluetooth_permission_screen.dart';
import 'internet/internet_disabled_screen.dart';
import 'notifications/notification_permission_cubit.dart';
import 'notifications/notification_permission_screen.dart';

part '../../../.generated/presentation/screens/onboarding/onboarding_routes.g.dart';

@TypedGoRoute<BluetoothPermissionRoute>(path: AppRoutes.onboardingBluetooth)
class BluetoothPermissionRoute extends GoRouteData with $BluetoothPermissionRoute {
  final bool isOnboarding;

  const BluetoothPermissionRoute({this.isOnboarding = false});

  @override
  Page<void> buildPage(BuildContext context, GoRouterState state) {
    final child = BlocProvider(
      create: (context) =>
          BluetoothPermissionCubit(locator.get(), locator.get(), isOnboarding: isOnboarding),
      child: const BluetoothPermissionScreen(),
    );
    if (isOnboarding) {
      return SlideInTransition(
        state: state,
        child: child,
      );
    }
    return SlideUpTransition(
      state: state,
      child: child,
    );
  }
}

@TypedGoRoute<NotificationPermissionRoute>(path: AppRoutes.onboardingNotification)
class NotificationPermissionRoute extends GoRouteData with $NotificationPermissionRoute {
  const NotificationPermissionRoute();

  @override
  Page<void> buildPage(BuildContext context, GoRouterState state) {
    return SlideInTransition(
      state: state,
      child: BlocProvider(
        lazy: false,
        create: (context) => NotificationPermissionCubit(
          locator.get(),
        ),
        child: const NotificationPermissionScreen(),
      ),
    );
  }
}

@TypedGoRoute<UsageTrackingPermissionRoute>(path: AppRoutes.onboardingUsageTracking)
class UsageTrackingPermissionRoute extends GoRouteData with $UsageTrackingPermissionRoute {
  const UsageTrackingPermissionRoute();

  @override
  Page<void> buildPage(BuildContext context, GoRouterState state) {
    return SlideInTransition(
      state: state,
      child: BlocProvider(
        lazy: false,
        create: (context) => UsageTrackingPermissionCubit(true, locator.get()),
        child: const UsageTrackingPermissionScreen(),
      ),
    );
  }
}

@TypedGoRoute<InternetDisabledRoute>(path: AppRoutes.internetDisabled)
class InternetDisabledRoute extends GoRouteData with $InternetDisabledRoute {
  const InternetDisabledRoute();

  @override
  Page<void> buildPage(BuildContext context, GoRouterState state) {
    return SlideUpTransition(
      state: state,
      child: const InternetDisabledScreen(),
    );
  }
}