import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart';
import 'package:syncrow_web/pages/routines/models/device_functions.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ac_dialog.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/ceiling_sensor/ceiling_sensor_helper.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/curtain_dialog.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/flush_presence_sensor/flush_presence_sensor.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/gateway/gateway_helper.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/one_gang_switch_dialog.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/power_clamp_enargy/energy_clamp_dialog.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/three_gang_switch_dialog.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/two_gang_switch_dialog.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/wall_sensor/wall_presence_sensor.dart';
import 'package:syncrow_web/pages/routines/widgets/routine_dialogs/water_heater/water_heater_presence_sensor.dart';

class DeviceDialogHelper {
  static Future<Map<String, dynamic>?> showDeviceDialog({
    required BuildContext context,
    required String dialogType,
    required Map<String, dynamic> data,
    required bool removeComparetors,
  }) async {
    final functions = data['functions'] as List<DeviceFunction>;

    try {
      final result = await _getDialogForDeviceType(
        dialogType: dialogType,
        context: context,
        productType: data['productType'] as String,
        data: data,
        functions: functions,
        removeComparetors: removeComparetors,
      );

      if (result != null) {
        return result;
      }
    } catch (e) {
      debugPrint('Error: $e');
    }

    return null;
  }

  static Future<Map<String, dynamic>?> _getDialogForDeviceType({
    required String dialogType,
    required BuildContext context,
    required String productType,
    required Map<String, dynamic> data,
    required List<DeviceFunction> functions,
    required bool removeComparetors,
  }) async {
    final routineBloc = context.read<RoutineBloc>();
    final deviceSelectedFunctions =
        routineBloc.state.selectedFunctions[data['uniqueCustomId']] ?? [];

    switch (productType) {
      case 'AC':
        return ACHelper.showACFunctionsDialog(
          context: context,
          functions: functions,
          device: data['device'],
          deviceSelectedFunctions: deviceSelectedFunctions,
          uniqueCustomId: data['uniqueCustomId'],
          removeComparetors: removeComparetors,
          dialogType: dialogType,
        );
      case 'CUR':
        return CurtainHelper.showControlDialog(
          dialogType: dialogType,
          context: context,
          functions: functions,
          uniqueCustomId: data['uniqueCustomId'],
          device: data['device'],
        );
      case '1G':
        return OneGangSwitchHelper.showSwitchFunctionsDialog(
            dialogType: dialogType,
            context: context,
            functions: functions,
            device: data['device'],
            deviceSelectedFunctions: deviceSelectedFunctions,
            uniqueCustomId: data['uniqueCustomId'],
            removeComparetors: removeComparetors);
      case '2G':
        return TwoGangSwitchHelper.showSwitchFunctionsDialog(
            dialogType: dialogType,
            context: context,
            functions: functions,
            device: data['device'],
            deviceSelectedFunctions: deviceSelectedFunctions,
            uniqueCustomId: data['uniqueCustomId'],
            removeComparetors: removeComparetors);
      case '3G':
        return ThreeGangSwitchHelper.showSwitchFunctionsDialog(
            dialogType: dialogType,
            context: context,
            functions: functions,
            device: data['device'],
            deviceSelectedFunctions: deviceSelectedFunctions,
            uniqueCustomId: data['uniqueCustomId'],
            removeComparetors: removeComparetors);
      case 'WPS':
        return WallPresenceSensor.showWPSFunctionsDialog(
            dialogType: dialogType,
            context: context,
            functions: functions,
            device: data['device'],
            deviceSelectedFunctions: deviceSelectedFunctions,
            uniqueCustomId: data['uniqueCustomId'],
            removeComparetors: removeComparetors);
      case 'CPS':
        return CeilingSensorHelper.showCeilingSensorDialog(
          context: context,
          functions: functions,
          device: data['device'],
          deviceSelectedFunctions: deviceSelectedFunctions,
          uniqueCustomId: data['uniqueCustomId'],
          dialogType: dialogType,
        );
      case 'GW':
        return GatewayHelper.showGatewayFunctionsDialog(
          context: context,
          functions: functions,
          uniqueCustomId: data['uniqueCustomId'],
          deviceSelectedFunctions: deviceSelectedFunctions,
          device: data['device'],
          dialogType: dialogType,
        );
      case 'NCPS':
        return FlushPresenceSensor.showFlushFunctionsDialog(
          context: context,
          functions: functions,
          uniqueCustomId: data['uniqueCustomId'],
          deviceSelectedFunctions: deviceSelectedFunctions,
          dialogType: dialogType,
          device: data['device'],
        );
      case 'WH':
        return WaterHeaterDialogRoutines.showWHFunctionsDialog(
          context: context,
          functions: functions,
          uniqueCustomId: data['uniqueCustomId'],
          deviceSelectedFunctions: deviceSelectedFunctions,
          dialogType: dialogType,
          device: data['device'],
        );

      case 'PC':
        return EnergyClampDialog.showEnergyClampFunctionsDialog(
          context: context,
          functions: functions,
          uniqueCustomId: data['uniqueCustomId'],
          deviceSelectedFunctions: deviceSelectedFunctions,
          dialogType: dialogType,
          device: data['device'],
        );

      default:
        return null;
    }
  }
}
