package com.ruoyi.wms.service;

import com.ruoyi.wms.util.TcpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.*;

/**
 * @Verasion:1.0
 * @Author:DZY
 * @Date:2023/7/5
 **/
@Component
@Slf4j
public class TcpService  implements CommandLineRunner {
    private ServerSocket serverSocket;
    public  DatagramSocket clientSocket;
    private DatagramPacket packet;
    @Autowired
    private AGVService agvService;
    public void start(int port) throws IOException
    {

    }

    public void stop() throws IOException
    {
        serverSocket.close();
    }

    private static AGVService userService;

    @PostConstruct
    public void init() {
        if (userService == null) {
            setDateSource(agvService);
        }
    }

    private synchronized static void setDateSource(AGVService userInterfaceService) {
        userService = userInterfaceService;
    }

    @Override
    public void run(String... args) throws Exception {
        clientSocket = new DatagramSocket(8085);
        //创建字节数组，指定接收的数据包的大小
        byte[] data = new byte[10];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // 3.接收客户端发送的数据
        while (true) {
            //通过循环不停的向客户端发送数据和接收数据
            try {
                // 此方法在接收到数据报之前会一直阻塞
                clientSocket.receive(packet);
                //创建字符串对象
                final String s = BinaryToHexString(data);
                final String[] s1 = s.split(" ");
                log.info("tcps:" + s);
                //设备信号 02：空车入库 01：出库1 04：出库2
                String status = s1[3];
                if (status.equals("06") || status.equals("04") || status.equals("00") || status.equals("02")) {
                    //成品出库
                    agvService.outProdStore("04");
                } else if (status.equals("03") || status.equals("01")) {
                    //成品出库
                    agvService.outProdStore("02");
                }
            }
            catch (Exception ex){
                System.out.println("我是服务器，客户端说：" );
            }
        }
    }

    @Scheduled(cron = "*/5 * * * * ?")
    private void configureTasks() throws IOException {
        byte[] bytes = new byte[8];
        bytes[0] = 1;
        bytes[1] = 2;
        bytes[2] = 0;
        bytes[3] = 0;
        bytes[4] = 0;
        bytes[5] = 04;
        bytes[6] = 121;
        bytes[7] = -55;
        //log.info("发送数据：" + bytes.toString());
        DatagramPacket packet2 = new DatagramPacket(bytes, 8, InetAddress.getByName("192.168.33.39"),1030);
        try {
            clientSocket.send(packet2);
        } catch (Exception e) {

        }

    }

    /**
     * 将字节数组转换成十六进制的字符串
     *
     * @return
     */
    public static String BinaryToHexString(byte[] bytes) {
        String hexStr = "0123456789ABCDEF";
        String result = "";
        String hex = "";
        for (byte b : bytes) {
            hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));
            hex += String.valueOf(hexStr.charAt(b & 0x0F));
            result += hex + " ";
        }
        return result;
    }
}
