import 'package:comwell_key_app/check_out/bloc/check_out_cubit.dart';
import 'package:comwell_key_app/check_out/bloc/check_out_state.dart';
import 'package:comwell_key_app/check_out/check_out_flow.dart';
import 'package:comwell_key_app/check_out/pages/check_out_error_page.dart';
import 'package:comwell_key_app/check_out/pages/check_out_success_page.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';

final checkOutRoutes = [_checkOutError, _checkOutSuccess, _checkOutFlow];

final _checkOutError = GoRoute(
  path: AppRoutes.checkOutError,
  builder: (context, state) {
    return BlocProvider(
      create: (context) => CheckoutCubit(state.extra as Booking, locator(), context.read()),
      child: BlocBuilder<CheckoutCubit, CheckoutState>(
        builder: (context, state) {
          return CheckOutErrorPage(key: ValueKey(state));
        },
      ),
    );
  },
);

final _checkOutSuccess = GoRoute(
  path: AppRoutes.checkOutSuccess,
  builder: (context, state) {
    final extras = state.extra as List<dynamic>;
    final digitalCard = extras[0] as bool;
    final booking = extras[1] as Booking;
    return BlocProvider(
      create: (context) => CheckoutCubit(booking, locator(), context.read()),
      child: BlocBuilder<CheckoutCubit, CheckoutState>(
        builder: (context, state) {
          return CheckOutSuccessPage(digitalCard: digitalCard, key: ValueKey(state));
        },
      ),
    );
  },
);

final _checkOutFlow = GoRoute(
  path: AppRoutes.checkOut,
  builder: (context, state) {
    final booking = state.extra as Booking;
    return BlocProvider(
      create: (context) => CheckoutCubit(booking, locator(), context.read()),
      child: BlocBuilder<CheckoutCubit, CheckoutState>(
        builder: (context, state) {
          return CheckOutFlow(key: ValueKey(state));
        },
      ),
    );
  },
);