import 'package:comwell_key_app/choose_share_room/components/share_room_confirm_dialog.dart';
import 'package:comwell_key_app/choose_share_room/cubit/choose_share_room_cubit.dart';
import 'package:comwell_key_app/choose_share_room/cubit/choose_share_room_state.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/l10n_utils.dart';
import 'package:flutter/material.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';

class ChooseRoomWidget extends StatelessWidget {
  final Booking booking;
  final String roomName;
  final String description;
  final int guests;
  final String imageAsset;
  final String? extraInfo;

  const ChooseRoomWidget({
    super.key,
    required this.booking,
    required this.roomName,
    required this.description,
    required this.guests,
    required this.imageAsset,
    this.extraInfo,
  });

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    return BlocBuilder<ChooseShareRoomCubit, ChooseShareRoomState>(
      builder: (context, state) {
        final cubit = context.read<ChooseShareRoomCubit>();
        final isAssigned = cubit.state.rooms.any(
          (room) =>
              room.confirmationNumber == booking.confirmationNumber && room.assignedTo != null,
        );
        return GestureDetector(
          onTap: () async {
            final result = await context.push(
              AppRoutes.roomInfo,
              extra: [booking, isAssigned],
            );
            if (result != null && result is bool) {
              await cubit.assignRoomToUser(booking.confirmationNumber, booking.firstName);
            }
          },
          child: Container(
            margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
            decoration: BoxDecoration(
              border: Border.all(color: colorDivider),
              borderRadius: BorderRadius.circular(16),
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Row(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text(
                            roomName,
                            style: theme.textTheme.headlineSmall,
                          ),
                          const SizedBox(height: 4),
                          SizedBox(
                            width: 200,
                            child: Text(
                              description,
                              style: theme.textTheme.bodySmall,
                              maxLines: 2,
                              overflow: TextOverflow.ellipsis,
                              softWrap: true,
                            ),
                          ),
                        ],
                      ),
                      ClipRRect(
                        borderRadius: BorderRadius.circular(8),
                        child: Image.asset(
                          imageAsset,
                          width: 60,
                          height: 60,
                          fit: BoxFit.cover,
                        ),
                      ),
                    ],
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(left: 16.0, right: 16.0, bottom: 8.0),
                  child: Row(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      SvgPicture.asset("assets/icons/user-circle.svg", width: 20, height: 20),
                      const SizedBox(width: 4),
                      Text(
                        '${booking.adults} ${booking.adults > 1 ? context.strings.adults : context.strings.adult}${booking.children > 0 ? ' | ${booking.children} ${booking.children > 1 ? context.strings.children : context.strings.child}' : ''}',
                        style: theme.textTheme.bodySmall,
                      ),
                      const VerticalDivider(color: colorDivider, thickness: 1.5),
                      Text(
                        context.strings.read_more,
                        style: theme.textTheme.bodySmall?.copyWith(
                          decoration: TextDecoration.underline,
                        ),
                      ),
                    ],
                  ),
                ),
                if (extraInfo != null) ...[
                  const SizedBox(height: 8),
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 16.0),
                    child: Text(
                      context.strings.added_to_room,
                      style: theme.textTheme.bodySmall,
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 16.0),
                    child: Text(
                      extraInfo!,
                      style: theme.textTheme.bodySmall?.copyWith(fontWeight: FontWeight.bold),
                    ),
                  ),
                  const SizedBox(height: 8),
                ],
                Column(
                  children: [
                    const Divider(color: colorDivider),
                    Padding(
                      padding: const EdgeInsets.only(
                        left: 16.0,
                        right: 16.0,
                        top: 8.0,
                        bottom: 16.0,
                      ),
                      child: SizedBox(
                        width: double.infinity,
                        child: ElevatedButton(
                          style: ElevatedButton.styleFrom(
                            elevation: 0,
                            foregroundColor: Colors.white,
                          ),
                          onPressed: () async {
                            if (isAssigned) {
                              context.push(AppRoutes.shareRoom, extra: booking);
                              return;
                            }
                            final result = await showDialog<bool>(
                              context: context,
                              barrierDismissible: false,
                              builder: (context) {
                                return const ShareRoomConfirmDialog();
                              },
                            );
                            if (result != null && result) {
                              await cubit.assignRoomToUser(
                                booking.confirmationNumber,
                                booking.firstName,
                              );
                              if (context.mounted) {
                                context.pop();
                              }
                            }
                          },
                          child: Text(
                            isAssigned ? context.strings.share_room : context.strings.choose_room,
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        );
      },
    );
  }
}