import 'package:common/localization/l10n_utils.dart';
import 'package:concierge/data/remote/models/product.dart';
import 'package:concierge/presentation/app/cart_cubit.dart';
import 'package:concierge/presentation/widgets/comment_field.dart';
import 'package:concierge/presentation/screens/review_order/widget/delivery_method_picker.dart';
import 'package:concierge/presentation/screens/review_order/widget/delivery_time_picker.dart';
import 'package:concierge/presentation/screens/review_order/widget/product_in_cart_list_tile.dart';
import 'package:concierge/presentation/screens/review_order/widget/review_order_app_bar.dart';
import 'package:concierge/presentation/widgets/bevelled_app_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:concierge/presentation/screens/review_order/bloc/review_order_cubit.dart';
import 'package:concierge/presentation/screens/review_order/bloc/review_order_state.dart';
import 'package:gap/gap.dart';

class ReviewOrderScreen extends StatelessWidget {
  const ReviewOrderScreen({super.key});

  @override
  Widget build(BuildContext context) {
    final cubit = context.read<ReviewOrderCubit>();
    return BlocBuilder<ReviewOrderCubit, ReviewOrderState>(
      builder: (context, state) {
        return MultiBlocListener(
          listeners: [
            BlocListener<ReviewOrderCubit, ReviewOrderState>(
              listenWhen: (prev, curr) => prev.isLoading && curr.error.isError,
              listener: (context, state) {},
            ),
          ],
          child: Scaffold(
            bottomNavigationBar: ReviewOrderAppBar(),
            body: Builder(
              builder: (context) {
                final widgets = buildContent(context).toList();
                return Stack(
                  children: [
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 16.0),
                      child: ListView.builder(
                        itemCount: widgets.length,
                        itemBuilder: (context, index) {
                          final widget = widgets[index];
                          return widget;
                        },
                      ),
                    ),
                    BevelledAppBar(
                      showBack: true,
                      showClose: false,
                    ),
                  ],
                );
              },
            ),
          ),
        );
      },
    );
  }

  Iterable<Widget> buildContent(BuildContext context) sync* {
    final cartCubit = context.watch<CartCubit>();
    yield* [
      Gap(100), // app bar offset
      Gap(48),
      Text(context.strings.your_order, style: TextStyle(fontSize: 20)),
      Gap(48),
      if (cartCubit.products.isNotEmpty) ...buildDeliveryMethod(context),
      ...buildProducts(context, cartCubit.products),
      Gap(36),
      if (cartCubit.products.isNotEmpty) ...buildCommentField(context),
      Gap(36),
    ];
  }

  Iterable<Widget> buildDeliveryMethod(BuildContext context) sync* {
    yield DeliveryMethodPicker();
    yield Gap(16);
    yield Divider(color: Colors.grey.shade300);
    yield DeliveryTimePicker();
  }

  Iterable<Widget> buildProducts(BuildContext context, Iterable<Product> products) sync* {
    if (products.isEmpty) {
      yield Gap(36);
      yield Center(
        child: Text(context.strings.no_products_in_cart),
      );
    } else {
      yield Divider(color: Colors.grey.shade300);
    }
    for (final product in products) {
      Gap(16);
      yield ProductInCartListTile(product: product);
      Gap(16);
      yield Divider(color: Colors.grey.shade300);
    }
  }
}