// Copyright (c) 2015 D1SM.net

package net.fs.rudp.message;

import java.net.DatagramPacket;
import java.util.ArrayList;
import java.util.HashMap;

import net.fs.rudp.SendRecord;
import net.fs.utils.ByteIntConvert;
import net.fs.utils.ByteShortConvert;




public class AckListMessage extends Message{
	ArrayList<Integer> ackList;
	byte[] dpData=null;
	int lastRead;

	int r1,r2,r3,s1,s2,s3;

	@SuppressWarnings("unchecked")
	public AckListMessage(long connId,ArrayList ackList,int lastRead,
			HashMap<Integer, SendRecord> sendRecordTable,int timeId,
			int connectId,int clientId){
		this.clientId=clientId;
		this.connectId=connectId;
		this.ackList=ackList;
		this.lastRead=lastRead;
		int len1=4+4+10+4*ackList.size();
		dpData=new byte[len1+24+9];
		sType=MessageType.sType_AckListMessage;
		ByteShortConvert.toByteArray(ver, dpData, 0);  //add: ver
		ByteShortConvert.toByteArray(sType, dpData, 2);  //add: service type
		ByteIntConvert.toByteArray(connectId, dpData, 4); //add: sequence
		ByteIntConvert.toByteArray(clientId, dpData, 8); //add: sequence
		
		ByteIntConvert.toByteArray(lastRead, dpData, 4+8);
		//dpData[8]=(byte) ackList.size();
		ByteShortConvert.toByteArray((short) ackList.size(), dpData, 8+8);  //add: service type
		for(int i=0;i<ackList.size();i++){
			int sequence=(Integer)ackList.get(i);
			ByteIntConvert.toByteArray(sequence, dpData, 10+4*i+8);  //add: sequence
			////#MLog.println("发送确认 "+sequence);
		}

		int u1=timeId-2;
		ByteIntConvert.toByteArray(u1, dpData,len1+8);
		SendRecord r1=sendRecordTable.get(u1);
		int s1=0;
		if(r1!=null){
			s1=r1.getSendSize();
		}
		ByteIntConvert.toByteArray(s1, dpData, len1+4+8);

		int u2=timeId-1;
		ByteIntConvert.toByteArray(u2, dpData,len1+8+8);
		SendRecord r2=sendRecordTable.get(u2);
		int s2=0;
		if(r2!=null){
			s2=r2.getSendSize();
		}
		ByteIntConvert.toByteArray(s2, dpData, len1+12+8);

		int u3=timeId;
		ByteIntConvert.toByteArray(u3, dpData,len1+16+8);
		SendRecord r3=sendRecordTable.get(u3);
		int s3=0;
		if(r3!=null){
			s3=r3.getSendSize();
		}
		ByteIntConvert.toByteArray(s3, dpData, len1+20+8);

		dp=new DatagramPacket(dpData,dpData.length);
		
	}

	public ArrayList getAckList(){
		return ackList;
	}

	public AckListMessage(DatagramPacket dp){
		this.dp=dp;
		dpData=dp.getData();
		ver=ByteShortConvert.toShort(dpData, 0);
		sType=ByteShortConvert.toShort(dpData, 2);
		connectId=ByteIntConvert.toInt(dpData, 4);
		clientId=ByteIntConvert.toInt(dpData, 8);
		
		
		lastRead=ByteIntConvert.toInt(dpData, 4+8);
		int sum=ByteShortConvert.toShort(dpData, 8+8);
		ackList=new ArrayList<Integer>();
		int t=0;
		for(int i=0;i<sum;i++){
			t=10+4*i;
			int sequence=ByteIntConvert.toInt(dpData, t+8);
			ackList.add(sequence);
		}
		////#MLog.println("LLLLLLLLLLLLLL "+dp.getLength()+" "+ackList.size());
		t=10+4*sum-4;
		r1=ByteIntConvert.toInt(dpData, t+4+8);
		s1=ByteIntConvert.toInt(dpData, t+8+8);

		r2=ByteIntConvert.toInt(dpData, t+12+8);
		s2=ByteIntConvert.toInt(dpData, t+16+8);

		r3=ByteIntConvert.toInt(dpData, t+20+8);
		s3=ByteIntConvert.toInt(dpData, t+24+8);

		////#MLog.println("aaaaaaaaa"+r3+"kkkkkkk "+s3);
	}

	public int getLastRead(){
		return lastRead;
	}

	public int getR1() {
		return r1;
	}

	public int getR3() {
		return r3;
	}

	public int getS1() {
		return s1;
	}

	public int getS2() {
		return s2;
	}

	public int getS3() {
		return s3;
	}

	public int getR2() {
		return r2;
	}

}