import 'dart:async';
import 'dart:convert';

import 'package:EasyDartModule/EasyDartModule.dart' as edm;
import 'package:easydevice/easydevice.dart';
import 'package:easyweb/base/easyws.dart';
import 'package:easyweb/base/minisdk.dart';
import 'package:easyweb/easyweb.dart';
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/util/FitTool.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/controller/user_info_controller.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';

class WebviewTestModel {
  WebviewTestModel();

  //EasyFlutter Start[Model]

  //EasyFlutter End
}

class WebviewTestController extends GetControllerEx<WebviewTestModel> {
  var selectDevice = {};
  var lastSelectDevice = {};
  var bluetooth = 0;
  List personList = [];
  List instantData = [];

  WebviewTestController() : super(WebviewTestModel()) {
    web = WebviewHelper(
      jsbridge: buildsdk(
<<<<<<< HEAD
          // father: this,
          // clientId: '494641114',
          // dbgserverUrl: 'ws://192.168.1.2:9001',
          ),
=======
        father: this,
        clientId: '494641114',
        // dbgserverUrl: 'ws://192.168.1.2:9001',
      ),
>>>>>>> 58b2bebe936bdd7239529662ef20b531f2143de4
      settings: buildsettings(),
      params: PlatformHeadlessInAppWebViewCreationParams(
        initialUrlRequest: URLRequest(
          url: WebUri(
              'https://wyf.it.real.he-info.cn:94/goods-front/index.html'),
        ),
        onLoadStop: (controller, url) {
          setState(() => ready.value = true);
          MHTHomeController deviceController = Get.find();
          web.jsbridge!.dart
              .updateDeviceList(deviceController.deviceList.values);
        },
      ),
    );
    try {
      web.jsbridge!.bind((bridge) {
        var minible = Minibleapp(bridge: bridge);
        // ef.kvroot.devicelist.listen((x) {});
        bridge.sdk.updateDeviceRoute((args) async {
          ef.log('updateDeviceRoute: $args');
          selectDevice['blueToothStatus'] = bluetooth;
          Get.toNamed("${args[0]}", arguments: selectDevice);
          return true;
        });
        bridge.sdk.selectDevice((args) async {
          try {
            ef.log('selectDevice: $args');
            selectDevice = args[0];
            await queryPersonInfoByMac();
            if (selectDevice != null &&
                selectDevice.isNotEmpty &&
                selectDevice['mac'] != null &&
                (selectDevice['mac'] != args[0]['mac'])) {
              lastSelectDevice = selectDevice;
            }
            dealInstantData(selectDevice);
          } catch (e) {
            ef.log("[aaaa]$e");
          }

          //查询人员信息

          return true;
        });
        bridge.sdk.updateBlueToothStatus((args) async {
          ef.log('updateBlueToothStatus: $args');
          bluetooth = args[0];
          return true;
        });
        //sdk定义接口
        bridge.sdk.querySelectDevice((args) async {
          ef.log('updateBlueToothStatus: $args');
          // bluetooth = args[0];
          MHTHomeController deviceController = Get.find();
          await deviceController.getDeviceList(group: 'room');
          final allDevices = deviceController.deviceList.values
              .expand((list) => list)
              .toList();
          return allDevices;
        });
        //请求token信息
        bridge.sdk.queryUserToken((args) async {
          ef.log('queryUserToken: $args');
          // bluetooth = args[0];
          return edm.EasyDartModule.dio.token;
        });
        //请求设备人员信息
        bridge.sdk.queryPersonInfo((args) async {
          ef.log('queryPersonInfo: $args');
          // bluetooth = args[0];
          return personList;
        });
        //请求实时体征数据
        bridge.sdk.queryInstantData((args) async {
          ef.log('queryInstantData: $args');
          // bluetooth = args[0];
          return instantData;
        });   
        bridge.sdk.startTimer((args) async {
          ef.log('queryInstantData: $args');
          MHTHomeController homeController = Get.find();
          homeController.startTimer(args);
          return true;
        });
        bridge.sdk.cancelTimer((args) async {
          ef.log('queryInstantData: $args');
          MHTHomeController homeController = Get.find();
          homeController.cancelTimer(args);
          return true;
        });
        bridge.sdk.restoreTimer((args) async {
          ef.log('queryInstantData: $args');
          MHTHomeController homeController = Get.find();
          var data = await homeController.restoreTimer(args);
          return data;
        });
      });
      web
          //.file(
          //  url: 'https://wsl.it.real.he-info.cn:94/webdemo/web.zip',
          //  pretag: 'https://wsl.it.real.he-info.cn:94/webdemo/',
          //)
          .network()
          .then((value) {
        if (value) {
          setState(() {
            ready.value = true;
          });
        }
      });
    } catch (e, s) {
      ef.log('$e,$s');
    }
  }
  late WebviewHelper web;
  var ready = false.obs;
  var cnt = 0.obs;

  Future<void> queryPersonInfoByMac() async {
    UserInfoController userInfoController = Get.find();
    String serviceAddress = ServiceConstant.service_address;
    String serviceName = ServiceConstant.server_service;
    String serviceApi = ServiceConstant.person_info;
    String queryUrl =
        "${serviceAddress}${serviceName}${serviceApi}?mac=${selectDevice['mac']}";
    try {
      final res = await requestWithLog(
          logTitle: "查询设备绑定人员列表",
          method: MyHttpMethod.get,
          queryUrl: queryUrl,
          onSuccess: (res) {
            personList = res.data;
          });
    } catch (e) {
      print("查询设备绑定列表失败: $e");
    }
  }

  void dealInstantData(selectDevice) {
    //处理实时数据
    // edm.EasyDartModule.websocket.sendData(
    // jsonEncode(WebSocketMessage(path: "/vsbs/web/rt/marttress", type: 2)));
    lastSelectDevice;
    var ws;
    ws = Easyws(
      url: ServiceConstant.webSocketService,
      onData: (data) {
        ef.log("ws recv =>$data");
        try {
          var tmp;
          if (data is String) {
            tmp = jsonDecode(data); // 只有是 String 才 decode
          } else if (data is Map<String, dynamic>) {
            tmp = data; // 直接用
          } else {
            print("未知数据格式");
          }
          if (tmp['data'] != null && tmp['data'] is Map) {
            var newData = tmp['data'];
            var mac = newData['mac'];
            if (mac != null) {
              // 删除已有的同 mac 项
              instantData.removeWhere((element) => element['mac'] == mac);
              // 添加新的数据
              instantData.add(newData);
            }
          }
        } catch (e) {
          ef.log("ws error =>$e");
        }
      },
      onStateChange: (x) {
        ef.log("ws =>$x");
        if (x == EasywsState.connected) {
          try {
            if (lastSelectDevice != null && lastSelectDevice.isNotEmpty) {
              List<String?> oldMacList = [
                lastSelectDevice['bind_mac_a'],
                lastSelectDevice['bind_mac_b'],
              ];
              for (String? mac in oldMacList) {
                if (mac != null && mac.isNotEmpty) {
                  bool success = ws.send({
                    "type": 2,
                    "path": "/vsbs/web/rt/marttress",
                    "data": {"mac": mac},
                  });
                  if (success) {
                    ef.log("✅ 已取消监听：$mac");
                  }
                }
              }
            }
          } catch (e) {
            ef.log("❌ 取消旧设备监听失败: $e");
          }
          try {
            // 2. 开始监听新设备（A/B 都监听）
            if (selectDevice != null && selectDevice.isNotEmpty) {
              List<String?> newMacList = [
                selectDevice['bind_mac_a'],
                selectDevice['bind_mac_b'],
              ];
              for (String? mac in newMacList) {
                if (mac != null && mac.isNotEmpty) {
                  bool success = ws.send({
                    "type": 1,
                    "path": "/vsbs/web/rt/marttress",
                    "data": {"mac": mac},
                  });
                  if (success) {
                    ef.log("✅ 开始监听新设备：$mac");
                  }
                }
              }

              // 更新记录
              lastSelectDevice = selectDevice;
            }
          } catch (e) {
            ef.log("❌ 监听新设备失败: $e");
          }
        }
      },
    );
    ws.connect();
  }
  //EasyFlutter End
}

class WebviewTestView extends GetComponent<WebviewTestController> {
  WebviewTestView({super.key, super.oncreate});

  @override
  Widget build(BuildContext context) {
    UserInfoController userInfoController = Get.find();
    MHTHomeController deviceController = Get.find();
    deviceController.getDeviceList().then((x) {
      if (controller.web.jsbridge!.inited) {
        //发送测试消息给webview
        controller.web.jsbridge!.dart
            .updateDeviceList(deviceController.deviceList.values);
      }
    });

    return Scaffold(
      backgroundColor: Colors.black12,
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: (userInfoController.model.login! != null &&
                userInfoController.model.login! == 1)
            ? MainAxisAlignment.start
            : MainAxisAlignment.center,
        children: [
          Obx(() {
            if (userInfoController.model.login! == null ||
                userInfoController.model.login! == 0) {
              return Center(
                // 包一层 Center，强制水平和垂直都居中
                child: Text(
                  "登录进行设备控制".tr,
                  style: TextStyle(color: Colors.white, fontSize: 30.rpx),
                ),
              );
            }

            return Expanded(
              child: Align(
                alignment: Alignment.topLeft,
                child: controller.ready.value
                    ? ((controller.cnt.value % 2 == 0)
                        ? controller.web.build(
                            key: ValueKey("A"),
                            headless: false,
                          )
                        : controller.web.build(
                            key: ValueKey("B"),
                            headless: false,
                          ))
                    : Container(),
              ),
            );
          }),
        ],
      ),
    );
  }
}
