import 'dart:typed_data';

import 'package:flutter/material.dart';

import '../connect/bluetooth_page.dart';
import '../connect/config/SocketSetting.dart';
import '../connect/config/app_config.dart';
import '../connect/config/blueParams.dart';
import '../connect/config/connect_type.dart';
import 'coor_trans.dart';



class Connect {
  SocketSetting socket = SocketSetting();
  BlueSetting blueSetting = BlueSetting();
  Config config = Config();
  init() async {
    await AppConfig.load();
    config = Config.fromJson(AppConfig.config);
    if (config.connectType != null) {
      // if (config.connectType == "wifi") {
      //   config.connectType = ConnectType.wifi;
      // } else {
      //   config.connectType = ConnectType.bluetooth;
      // }
      blueToothController.connectedType.value =
          config.connectType ?? ConnectType.none;
      if (config.connectType == ConnectType.wifi) {
        if (config.ip != null) {
          socket.ip =  config.ip ?? "192.168.4.1";
          socket.port = config.port ?? 6000;
          await socket.connect();
        }
      } else {
        if (config.deviceId != "") {
          blueToothController.connectedDeviceID.value = config.deviceId!;
          //蓝牙
          await blueSetting.connect(config.deviceId!);
        }
      }
    }
  }

  disconnect(ConnectType type) {
    if (type == ConnectType.wifi) {
      socket.disConnect();
    } else {
      blueSetting.disConnect(blueToothController.connectedDeviceID.value);
    }
  }

// 实时读写
  write(Uint8List value) {
    if (blueToothController.connectedType.value == ConnectType.wifi) {
      socket.write(value);
    } else if (blueToothController.connectedType.value ==
        ConnectType.bluetooth) {
      blueSetting.write(blueToothController.connectedDeviceID.value, value);
    } else {
      print("暂无连接");
    }
  }

  writeCoorTransValue(String deviceId, CoorTransModel coorTrans) {
    Uint8List bytes = Uint8List(20);
    ByteData data = ByteData.view(bytes.buffer);
    // 0xF0 + 2字节地址 + 1字节数据长度(以字节为单位)+ 数据
    data.setInt8(0, 0xF0);
    data.setInt16(1, 608, Endian.little);
    data.setInt8(3, 16);
    // data.setFloat64(4, coorTrans.L0);

// 椭球基准 601 2
    sendData(
        bytes, 601, 2, [toCoordString(coorTrans.dstEllipsoid).index], deviceId);

// L0,elevation  608 16
    Future.delayed(const Duration(milliseconds: 2000), () {
      sendData(
          bytes,
          608,
          16,
          [(coorTrans.L0 * 1e8).toInt(), (coorTrans.elevation * 1000).toInt()],
          deviceId);
    });

// x 616 16
    Future.delayed(const Duration(milliseconds: 3000), () {
      sendData(
          bytes,
          616,
          16,
          [(coorTrans.dx * 1000).toInt(), (coorTrans.wx * 1000).toInt()],
          deviceId);
    });

// y 624 16
    Future.delayed(const Duration(milliseconds: 4000), () {
      sendData(
          bytes,
          624,
          16,
          [(coorTrans.dy * 1000).toInt(), (coorTrans.wy * 1000).toInt()],
          deviceId);
    });

// z 632 16
    Future.delayed(const Duration(milliseconds: 4000), () {
      sendData(
          bytes,
          632,
          16,
          [(coorTrans.dz * 1000).toInt(), (coorTrans.wz * 1000).toInt()],
          deviceId);
    });

// k 640 8
    Future.delayed(const Duration(milliseconds: 5000), () {
      ByteData data = ByteData.view(bytes.buffer);
      data.setInt8(0, 0xF0);
      data.setInt16(1, 640, Endian.little);
      data.setInt8(3, 8);
      data.setInt64(4, (coorTrans.k * 1000).toInt(), Endian.little);
      write(bytes);
    });

    Future.delayed(const Duration(milliseconds: 7000), () {
      save(deviceId, bytes, data);
    });
  }

  void sendData(Uint8List bytes, int code, int length, List<int> values,
      String deviceId) {
    ByteData data = ByteData.view(bytes.buffer);
    data.setInt8(0, 0xF0);
    data.setInt16(1, code, Endian.little);
    data.setInt8(3, length);
    for (int i = 0; i < values.length; i++) {
      data.setInt64(4 + i * 8, (values[i] * 1000).toInt(), Endian.little);
    }
    write(bytes);
  }

  save(String deviceId, Uint8List bytes, ByteData data) {
    // 采用 0X55BB 600 2
    data.setInt16(1, 600, Endian.little);
    data.setInt8(3, 2);
    data.setUint16(4, 0x55AA, Endian.little);
    write(bytes);
  }

  Coord toCoordString(String coord) {
    switch (coord) {
      case "BJ54":
        return Coord.BJ54;
      case "XA80":
        return Coord.XA80;
      case "WGS84":
        return Coord.WGS84;
      case "WGS2000":
        return Coord.WGS2000;
      default:
        return Coord.WGS2000;
    }
  }

  writeAntenna(Offset center, Offset right, String deviceId) {
    Uint8List bytes = Uint8List(20);
    ByteData data = ByteData.view(bytes.buffer);

    // 604 8  X0右侧天线 X1 中心点
    data.setInt8(0, 0xF0);
    data.setInt16(1, 604, Endian.little);
    data.setInt8(3, 8);
    data.setInt16(4, (right.dx * 1000).toInt(), Endian.little);
    data.setInt16(6, (right.dy * 1000).toInt(), Endian.little);
    data.setInt16(8, (center.dx * 1000).toInt(), Endian.little);
    data.setInt16(10, (center.dy * 1000).toInt(), Endian.little);
    write(bytes);
    Future.delayed(const Duration(milliseconds: 1000), () {
      save(deviceId, bytes, data);
    });
  }
}