import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart';
import 'package:syncrow_web/pages/routines/bloc/functions_bloc/functions_bloc_bloc.dart';
import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart';
import 'package:syncrow_web/pages/routines/helper/duration_format_helper.dart';
import 'package:syncrow_web/pages/routines/models/device_functions.dart';
import 'package:syncrow_web/pages/routines/models/gang_switches/base_switch_function.dart';
import 'package:syncrow_web/pages/routines/models/gang_switches/switch_operational_value.dart';
import 'package:syncrow_web/pages/routines/widgets/custom_routines_textbox.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_footer.dart';
import 'package:syncrow_web/pages/routines/widgets/dialog_header.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/helpers/routine_tap_function_helper.dart';
import 'package:syncrow_web/utils/color_manager.dart';
import 'package:syncrow_web/utils/extension/build_context_x.dart';

class TwoGangSwitchHelper {
  static Future<Map<String, dynamic>?> showSwitchFunctionsDialog({
    required BuildContext context,
    required List<DeviceFunction> functions,
    required AllDevicesModel? device,
    required List<DeviceFunctionData>? deviceSelectedFunctions,
    required String uniqueCustomId,
    required bool removeComparetors,
    required String dialogType,
  }) async {
    List<BaseSwitchFunction> switchFunctions =
        functions.whereType<BaseSwitchFunction>().toList();

    return showDialog<Map<String, dynamic>?>(
      context: context,
      builder: (BuildContext context) {
        return BlocProvider(
            create: (_) => FunctionBloc()
              ..add(InitializeFunctions(deviceSelectedFunctions ?? [])),
            child: AlertDialog(
              contentPadding: EdgeInsets.zero,
              content: BlocBuilder<FunctionBloc, FunctionBlocState>(
                builder: (context, state) {
                  final selectedFunction = state.selectedFunction;
                  final selectedOperationName = state.selectedOperationName;
                  final selectedFunctionData = state.addedFunctions
                      .firstWhere((f) => f.functionCode == selectedFunction,
                          orElse: () => DeviceFunctionData(
                                entityId: '',
                                functionCode: selectedFunction ?? '',
                                operationName: '',
                                value: null,
                              ));
                  return Container(
                    width: selectedFunction != null ? 600 : 360,
                    height: 450,
                    decoration: BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.circular(20),
                    ),
                    padding: const EdgeInsets.only(top: 20),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        DialogHeader(dialogType == 'THEN'
                            ? '2 Gangs Light Switch Functions'
                            : '2 Gangs Light Switch Condition'),
                        Expanded(
                          child: Row(
                            children: [
                              // Left side: Function list
                              Expanded(
                                child: ListView.separated(
                                  itemCount: switchFunctions.length,
                                  separatorBuilder: (_, __) => const Divider(
                                    color: ColorsManager.dividerColor,
                                  ),
                                  itemBuilder: (context, index) {
                                    final function = switchFunctions[index];
                                    return ListTile(
                                      leading: SvgPicture.asset(
                                        function.icon,
                                        width: 24,
                                        height: 24,
                                      ),
                                      title: Text(
                                        function.operationName,
                                        style: context.textTheme.bodyMedium,
                                      ),
                                      trailing: const Icon(
                                        Icons.arrow_forward_ios,
                                        size: 16,
                                        color: ColorsManager.textGray,
                                      ),
                                      onTap: () => RoutineTapFunctionHelper
                                          .onTapFunction(
                                        context,
                                        functionCode: function.code,
                                        functionOperationName:
                                            function.operationName,
                                        functionValueDescription:
                                            selectedFunctionData
                                                .valueDescription,
                                        deviceUuid: device?.uuid,
                                        codesToAddIntoFunctionsWithDefaultValue: [
                                          'countdown_1',
                                          'countdown_2',
                                        ],
                                      ),
                                    );
                                  },
                                ),
                              ),
                              // Right side: Value selector
                              if (selectedFunction != null)
                                Expanded(
                                  child: _buildValueSelector(
                                    context: context,
                                    selectedFunction: selectedFunction,
                                    selectedFunctionData: selectedFunctionData,
                                    switchFunctions: switchFunctions,
                                    device: device,
                                    operationName: selectedOperationName ?? '',
                                    removeComparetors: removeComparetors,
                                    dialogType: dialogType,
                                  ),
                                ),
                            ],
                          ),
                        ),
                        Container(
                          height: 1,
                          width: double.infinity,
                          color: ColorsManager.greyColor,
                        ),
                        DialogFooter(
                          onCancel: () {
                            Navigator.pop(context);
                          },
                          onConfirm: state.addedFunctions.isNotEmpty
                              ? () {
                                  /// add the functions to the routine bloc
                                  // for (var function in state.addedFunctions) {
                                  //   context.read<RoutineBloc>().add(
                                  //         AddFunctionToRoutine(
                                  //           function,
                                  //           uniqueCustomId
                                  //         ),
                                  //       );
                                  // }
                                  final selectedFunctionData =
                                      state.addedFunctions.firstWhere(
                                    (f) =>
                                        f.functionCode ==
                                        state.selectedFunction,
                                    orElse: () => DeviceFunctionData(
                                      entityId: '',
                                      functionCode:
                                          state.selectedFunction ?? '',
                                      operationName: '',
                                      value: null,
                                    ),
                                  );
                                  context.read<RoutineBloc>().add(
                                        AddFunctionToRoutine(
                                          [selectedFunctionData],
                                          uniqueCustomId,
                                        ),
                                      );
                                  // Return the device data to be added to the container
                                  Navigator.pop(context, {
                                    'deviceId': functions.first.deviceId,
                                  });
                                }
                              : null,
                          isConfirmEnabled: selectedFunction != null,
                        ),
                      ],
                    ),
                  );
                },
              ),
            ));
      },
    );
  }

  static Widget _buildValueSelector({
    required BuildContext context,
    required String selectedFunction,
    required DeviceFunctionData? selectedFunctionData,
    required List<BaseSwitchFunction> switchFunctions,
    AllDevicesModel? device,
    required String operationName,
    required bool removeComparetors,
    required String dialogType,
  }) {
    if (selectedFunction == 'countdown_1' ||
        selectedFunction == 'countdown_2') {
      final initialValue = selectedFunctionData?.value ?? 0;
      return _buildTemperatureSelector(
          context: context,
          initialValue: initialValue,
          selectCode: selectedFunction,
          currentCondition: selectedFunctionData?.condition,
          device: device,
          operationName: operationName,
          selectedFunctionData: selectedFunctionData,
          removeComparetors: removeComparetors,
          dialogType: dialogType);
    }

    final selectedFn =
        switchFunctions.firstWhere((f) => f.code == selectedFunction);
    final values = selectedFn.getOperationalValues();

    return _buildOperationalValuesList(
      context: context,
      values: values,
      selectedValue: selectedFunctionData?.value,
      device: device,
      operationName: operationName,
      selectCode: selectedFunction,
      selectedFunctionData: selectedFunctionData,
    );
  }

  static Widget _buildTemperatureSelector({
    required BuildContext context,
    required dynamic initialValue,
    required String? currentCondition,
    required String selectCode,
    AllDevicesModel? device,
    required String operationName,
    DeviceFunctionData? selectedFunctionData,
    bool? removeComparetors,
    String? dialogType,
  }) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        _buildCountDownSlider(context, initialValue, device, operationName,
            selectedFunctionData, selectCode, dialogType!),
      ],
    );
  }

  /// Build condition toggle for AC functions dialog
  static Widget _buildConditionToggle(
    BuildContext context,
    String? currentCondition,
    String selectCode,
    AllDevicesModel? device,
    String operationName,
    DeviceFunctionData? selectedFunctionData,
    // Function(String) onConditionChanged,
  ) {
    final conditions = ["<", "==", ">"];

    return ToggleButtons(
      onPressed: (int index) {
        context.read<FunctionBloc>().add(
              AddFunction(
                functionData: DeviceFunctionData(
                  entityId: device?.uuid ?? '',
                  functionCode: selectCode,
                  operationName: operationName,
                  condition: conditions[index],
                  value: selectedFunctionData?.value ?? 0,
                  valueDescription: selectedFunctionData?.valueDescription,
                ),
              ),
            );
      },
      borderRadius: const BorderRadius.all(Radius.circular(8)),
      selectedBorderColor: ColorsManager.primaryColorWithOpacity,
      selectedColor: Colors.white,
      fillColor: ColorsManager.primaryColorWithOpacity,
      color: ColorsManager.primaryColorWithOpacity,
      constraints: const BoxConstraints(
        minHeight: 40.0,
        minWidth: 40.0,
      ),
      isSelected:
          conditions.map((c) => c == (currentCondition ?? "==")).toList(),
      children: conditions.map((c) => Text(c)).toList(),
    );
  }

  /// Build temperature display for AC functions dialog
  static Widget _buildCountDownDisplay(
      BuildContext context,
      dynamic initialValue,
      AllDevicesModel? device,
      String operationName,
      DeviceFunctionData? selectedFunctionData,
      String selectCode) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
      decoration: BoxDecoration(
        color: ColorsManager.primaryColorWithOpacity.withOpacity(0.1),
        borderRadius: BorderRadius.circular(10),
      ),
      child: Text(
        DurationFormatMixin.formatDuration(initialValue?.toInt() ?? 0),
        style: context.textTheme.headlineMedium!.copyWith(
          color: ColorsManager.primaryColorWithOpacity,
        ),
      ),
    );
  }

  static Widget _buildCountDownSlider(
    BuildContext context,
    dynamic initialValue,
    AllDevicesModel? device,
    String operationName,
    DeviceFunctionData? selectedFunctionData,
    String selectCode,
    String dialogType,
  ) {
    return CustomRoutinesTextbox(
      withSpecialChar: true,
      currentCondition: selectedFunctionData?.condition,
      dialogType: dialogType,
      sliderRange: (0, 43200),
      displayedValue: (initialValue ?? 0).toString(),
      initialValue: (initialValue ?? 0).toString(),
      onConditionChanged: (condition) {
        context.read<FunctionBloc>().add(
              AddFunction(
                functionData: DeviceFunctionData(
                  entityId: device?.uuid ?? '',
                  functionCode: selectCode,
                  operationName: operationName,
                  condition: condition,
                  value: selectedFunctionData?.value ?? 0,
                  valueDescription: selectedFunctionData?.valueDescription,
                ),
              ),
            );
      },
      onTextChanged: (value) {
        final roundedValue =
            value.round(); // Round to nearest integer (stepSize 1)
        context.read<FunctionBloc>().add(
              AddFunction(
                functionData: DeviceFunctionData(
                  entityId: device?.uuid ?? '',
                  functionCode: selectCode,
                  operationName: operationName,
                  value: roundedValue,
                  condition: selectedFunctionData?.condition,
                  valueDescription: selectedFunctionData?.valueDescription,
                ),
              ),
            );
      },
      unit: 'sec',
      dividendOfRange: 1,
      stepIncreaseAmount: 1,
    );
  }

  static Widget _buildOperationalValuesList({
    required BuildContext context,
    required List<SwitchOperationalValue> values,
    required dynamic selectedValue,
    AllDevicesModel? device,
    required String operationName,
    required String selectCode,
    DeviceFunctionData? selectedFunctionData,
  }) {
    return ListView.builder(
      shrinkWrap: false,
      physics: const AlwaysScrollableScrollPhysics(),
      itemCount: values.length,
      itemBuilder: (context, index) {
        final value = values[index];
        final isSelected = selectedValue == value.value;
        return ListTile(
          leading: SvgPicture.asset(
            value.icon,
            width: 24,
            height: 24,
            placeholderBuilder: (BuildContext context) => Container(
              width: 24,
              height: 24,
              color: Colors.transparent,
            ),
          ),
          title: Text(
            value.description,
            style: context.textTheme.bodyMedium,
          ),
          trailing: Icon(
            isSelected
                ? Icons.radio_button_checked
                : Icons.radio_button_unchecked,
            size: 24,
            color: isSelected
                ? ColorsManager.primaryColorWithOpacity
                : ColorsManager.textGray,
          ),
          onTap: () {
            if (!isSelected) {
              context.read<FunctionBloc>().add(
                    AddFunction(
                      functionData: DeviceFunctionData(
                        entityId: device?.uuid ?? '',
                        functionCode: selectCode,
                        operationName: operationName,
                        value: value.value,
                        condition: selectedFunctionData?.condition,
                        valueDescription:
                            selectedFunctionData?.valueDescription,
                      ),
                    ),
                  );
            }
          },
        );
      },
    );
  }
}
