package responsecs

import (
	"encoding/binary"
	"unsafe"
)

const (
	RC_SUCCESS = iota
	RC_FAIL
)

const (
	TTS_COMMAND = iota
	REFER_COMMAND
	BYE_COMMAND
	BARGEIN_COMMAND
	DTMF_COMMAND
)

type Response struct {
	agentName  string
	telNo      string
	command    uint32
	resultCode uint32
	payloadLen uint64
}

func NewResponse(agentname string, telno string, command int, rc int, payloadLength int) *Response {
	r := Response{agentName: agentname, telNo: telno, command: uint32(command), resultCode: uint32(rc), payloadLen: uint64(payloadLength)}
	return &r
}

func (r Response) GetData() []byte {
	agentNameLen := 20
	telNoLen := 50
	commandLen := int(unsafe.Sizeof(r.command))
	rcLen := int(unsafe.Sizeof(r.resultCode))
	plLen := int(unsafe.Sizeof(r.payloadLen))

	retBin := make([]byte, commandLen+rcLen+plLen+agentNameLen+telNoLen)

	commandBin := make([]byte, commandLen)
	binary.LittleEndian.PutUint32(commandBin, uint32(r.command))

	rcBin := make([]byte, rcLen)
	binary.LittleEndian.PutUint32(rcBin, uint32(r.resultCode))

	plBin := make([]byte, plLen)
	binary.LittleEndian.PutUint64(plBin, uint64(r.payloadLen))

	agentNameBin := []byte(r.agentName)
	telNoBin := []byte(r.telNo)

	copy(retBin, commandBin)
	copy(retBin[commandLen:], rcBin)
	copy(retBin[commandLen+rcLen:], plBin)
	copy(retBin[commandLen+rcLen+plLen:], agentNameBin)
	copy(retBin[commandLen+rcLen+plLen+agentNameLen:], telNoBin)

	return retBin
}
