package com.its.api.xnetudp.codec;

import com.its.api.xnetudp.protocol.CENTER_COMM_MESSAGE;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import io.netty.handler.codec.MessageToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class CenterCommServerDecoder extends MessageToMessageDecoder<DatagramPacket> {

	@Override
	protected void decode(ChannelHandlerContext ctx, DatagramPacket packet, List<Object> out) throws Exception {

		ByteBuf buf = packet.content();

		int recvBytes = buf.readableBytes();
		log.info("RECV UDP: [{}], {} Bytes.", packet.sender().getAddress().getHostAddress(), recvBytes);

		if (buf.readableBytes() < CENTER_COMM_MESSAGE.CENTER_HEADER_SIZE) {
			log.error("RECV UDP: UDP Message header length error: {}/{} Bytes.", recvBytes, CENTER_COMM_MESSAGE.CENTER_HEADER_SIZE);
			return;
		}

		byte[] buffer = new byte[recvBytes];
		buf.getBytes(buf.readerIndex(), buffer);
		//log.error("RECV UDP, DUMP: {}, {}", packet.sender().getAddress().getHostAddress(), SysUtils.byteArrayToHex(buffer));
//01 00 01 01 00 01 00 00 00 00
//27 07 01 01 00 FF 00 00 04 D1   0C 00 29 31 30 30
//27 07 01 01 00 FF 00 00 00 10   0B 00 32 30 32 32 30 33 32 34 31 35 34 38 31 30

//#define INT_OP_VMS_STATE_REQ      0x01          /* VMS 통신 서버, VMS 시설물 상태정보 요청 */
//#define INT_OP_VMS_STATE_RES      0x02          /* VMS 통신 서버, VMS 시설물 상태정보 전송 */
//#define INT_OP_VMS_POWER_CTL      0x03          /* VMS 통신 서버, VMS 전광판 On/Off 제어 */
//#define INT_OP_VMS_LUMINANCE_CTL  0x04          /* VMS 통신 서버, VMS 휘도 제어 */
		//typedef struct int_head
		//{
		//	BYTE  SendId;							/* 송신 시스템 ID */
		//	BYTE  RecvId;							/* 수신 시스템 ID */
		//	BYTE  TotalFrame;						/* 전체 프레임 갯수 */
		//	BYTE  CurrentFrame;						/* 현재 프레임 번호 */
		//	BYTE  Reserved;							/* Reserved */
		//	BYTE  OPCode;							/* 명령어 */
		//	DWORD Length;							/* 데이터의 길이 */
		//} INT_HEAD;

		CENTER_COMM_MESSAGE msg = new CENTER_COMM_MESSAGE(buffer, packet.sender());
		out.add(msg);
	}
}
