import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/common/components/shimmer_loader/up_sales_catalog_shimmer_loader.dart';
import 'package:comwell_key_app/up_sales/components/catalog/addon_upgrade_catalog.dart';
import 'package:comwell_key_app/up_sales/components/catalog/room_upgrade_catalog.dart';
import 'package:comwell_key_app/up_sales/components/catalog/service_catalog.dart';
import 'package:comwell_key_app/up_sales/components/up_sales_continue_button.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

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

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    return BlocBuilder<UpSalesCubit, UpSalesState>(
      builder: (context, state) {
        // Show shimmer loader when loading
        if (state.isLoading) {
          return Scaffold(
            appBar: const ComwellAppBar(),
            backgroundColor: Theme.of(context).colorScheme.surface,
            body: const UpSalesCatalogShimmerLoader(),
          );
        }

        final cubit = context.read<UpSalesCubit>();
        final serviceUpgrades = cubit.state.addOnUpgrades
            .where((upgrade) => upgrade.isService)
            .toList();
        final addonUpgrades = cubit.upSales.addOnUpgrades
            .where((upgrade) => !upgrade.isService)
            .toList();
        final selectedRoomUpgrade = cubit.state.selectedRoomUpgrade.isEmpty
            ? null
            : cubit.upSales.roomUpgrades.firstWhere((e) => e.id == cubit.state.selectedRoomUpgrade);

        return Scaffold(
          appBar: const ComwellAppBar(),
          backgroundColor: Theme.of(context).colorScheme.surface,
          body: SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.only(
                top: 24,
                bottom: 100,
                left: 0,
                right: 0,
              ),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 16),
                    child: Text(
                      context.strings.up_sales_catalog_title,
                      style: theme.textTheme.headlineLarge,
                    ),
                  ),
                  const SizedBox(height: 40),
                  if (serviceUpgrades.isNotEmpty && serviceUpgrades.any((e) => e.isService)) ...[
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 16),
                      child: Text(context.strings.services, style: theme.textTheme.headlineMedium),
                    ),
                    const SizedBox(height: 8),
                    ServiceCatalog(
                      booking: cubit.booking,
                      upSales: serviceUpgrades,
                      onServiceSelected: (upgrade, isSelected) {
                        cubit.toggleSelectedUpgrade(upgrade);
                      },
                      onTap: (upgrade) {
                        cubit.toggleSelectedUpgrade(upgrade);
                      },
                    ),
                  ],
                  const SizedBox(height: 24),
                  if (cubit.upSales.roomUpgrades.isNotEmpty) ...[
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 16),
                      child: Text(
                        context.strings.room_upgrades,
                        style: theme.textTheme.headlineMedium,
                      ),
                    ),
                    const SizedBox(height: 8),
                    RoomUpgradeCatalog(
                      booking: cubit.booking,
                      availableRoomUpgrades: cubit.upSales.roomUpgrades,
                      selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
                      onRoomUpgradeSelected: (upgrade, isSelected) {
                        cubit.toggleSelectedUpgrade(upgrade);
                      },
                      onTap: (upgrade) {
                        cubit.toggleSelectedUpgrade(upgrade);
                      },
                    ),
                    const SizedBox(height: 24),
                  ],
                  if (addonUpgrades.any((e) => !e.isService)) ...[
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 16),
                      child: Text(
                        context.strings.other_up_sales,
                        style: theme.textTheme.headlineMedium,
                      ),
                    ),
                    const SizedBox(height: 8),
                    AddOnUpgradeCatalog(
                      addOnUpgrades: cubit.otherUpgrades,
                      extrasTotalPrice: cubit.extrasTotalPrice,
                      selectedRoomUpgrade: selectedRoomUpgrade?.id ?? '',
                      onAddOnUpgradeSelected: (upgrade, quantity) {
                        cubit.updateAddonUpgradeQuantity(upgrade, quantity);
                      },
                      onServingTimeSelected: (time) {},
                    ),
                  ],
                  const SizedBox(height: 24),
                ],
              ),
            ),
          ),
          bottomNavigationBar: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              const Divider(color: colorDivider),
              UpSalesContinueButton(
                selectedUpSales: cubit.selectedAddOnUpgrades,
                extrasTotalPrice: cubit.extrasTotalPrice,
                selectedRoomUpgrade: selectedRoomUpgrade,
              ),
            ],
          ),
        );
      },
    );
  }
}