import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart';
import 'package:syncrow_app/features/devices/view/widgets/scene_listview.dart';
import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart';
import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_bloc.dart';
import 'package:syncrow_app/features/scene/bloc/scene_bloc/scene_event.dart';
import 'package:syncrow_app/features/scene/bloc/smart_scene/smart_scene_select_dart_bloc.dart';
import 'package:syncrow_app/features/scene/helper/scene_bloc_factory.dart';
import 'package:syncrow_app/features/scene/widgets/empty_devices_widget.dart';
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_grid_view.dart';
import 'package:syncrow_app/features/scene/widgets/scene_view_widget/scene_header.dart';
import 'package:syncrow_app/features/shared_widgets/app_loading_indicator.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';

class SceneView extends StatelessWidget {
  const SceneView({
    this.pageType = false,
    super.key,
  });

  final bool pageType;

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => SceneBlocFactory.create(
        pageType: pageType,
        homeCubit: HomeCubit.getInstance(),
      ),
      child: BlocBuilder<CreateSceneBloc, CreateSceneState>(
        builder: (context, state) {
          final selectedSpace = HomeCubit.getInstance().selectedSpace;
          if (state is DeleteSceneSuccess) {
            if (state.success) _loadScenesAndAutomations(context, selectedSpace);
          }
          if (state is CreateSceneWithTasks) {
            if (state.success) {
              _loadScenesAndAutomations(context, selectedSpace);
              context.read<SmartSceneSelectBloc>().add(const SmartSceneClearEvent());
            }
          }
          return BlocListener<SceneBloc, SceneState>(
            listener: (context, state) {
              if (state is SceneTriggerSuccess) {
                context.showCustomSnackbar(
                  message: 'Scene ${state.sceneName} triggered successfully!',
                );
              }
            },
            child: HomeCubit.getInstance().spaces.isEmpty
                ? const EmptyDevicesWidget()
                : Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      if (!pageType) ...[
                        const SceneHeader(),
                        const SizedBox(height: 8),
                      ],
                      BlocBuilder<SceneBloc, SceneState>(
                        builder: (context, state) {
                          if (state is SceneLoading) {
                            return const AppLoadingIndicator();
                          }
                          if (state is SceneError) {
                            return Center(
                              child: Text(state.message),
                            );
                          }
                          if (state is SceneLoaded) {
                            final scenes = state.scenes;
                            final automationList = state.automationList;
                            if (scenes.isEmpty) return const EmptyDevicesWidget();

                            if (pageType) {
                              return SizedBox(
                                height: context.height * 0.1,
                                child: SceneListview(
                                  scenes: scenes,
                                  loadingSceneId: state.loadingSceneId,
                                ),
                              );
                            }

                            return Theme(
                              data: Theme.of(context).copyWith(
                                dividerColor: Colors.transparent,
                              ),
                              child: Expanded(
                                child: ListView(
                                  children: [
                                    ExpansionTile(
                                      tilePadding: const EdgeInsets.symmetric(
                                        horizontal: 6,
                                      ),
                                      initiallyExpanded: true,
                                      iconColor: ColorsManager.grayColor,
                                      title: const BodyMedium(
                                        text: 'Tap to run routines',
                                      ),
                                      children: [
                                        if (scenes.isNotEmpty)
                                          SceneGrid(
                                            scenes: scenes,
                                            loadingSceneId: state.loadingSceneId,
                                            disablePlayButton: false,
                                            loadingStates: state.loadingStates,
                                          )
                                        else
                                          const Center(
                                            child: BodyMedium(
                                              text: 'No scenes have been added yet',
                                            ),
                                          ),
                                        const SizedBox(height: 10),
                                      ],
                                    ),
                                    ExpansionTile(
                                      initiallyExpanded: true,
                                      iconColor: ColorsManager.grayColor,
                                      tilePadding: const EdgeInsets.symmetric(
                                        horizontal: 6,
                                      ),
                                      title: const BodyMedium(text: 'Automation'),
                                      children: [
                                        if (automationList.isNotEmpty)
                                          SceneGrid(
                                            scenes: automationList,
                                            loadingSceneId: state.loadingSceneId,
                                            disablePlayButton: true,
                                            loadingStates: state.loadingStates,
                                          )
                                        else
                                          const Center(
                                            child: BodyMedium(
                                              text:
                                                  'No automations have been added yet',
                                            ),
                                          ),
                                        const SizedBox(height: 10),
                                      ],
                                    ),
                                    const SizedBox(height: 15),
                                  ],
                                ),
                              ),
                            );
                          }
                          return const SizedBox.shrink();
                        },
                      ),
                    ],
                  ),
          );
        },
      ),
    );
  }

  void _loadScenesAndAutomations(BuildContext context, SpaceModel? selectedSpace) {
    BlocProvider.of<SceneBloc>(context)
      ..add(
        LoadScenes(
          selectedSpace!.id,
          selectedSpace,
          showInDevice: pageType,
        ),
      )
      ..add(
        LoadAutomation(
          selectedSpace.id,
          selectedSpace.community.uuid,
        ),
      );
  }
}
