/*******************************************************************************
 * Copyright (c) 2014-2015 IBM Corp.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Allan Stockdill-Mander - initial API and implementation
 *******************************************************************************/

package packets

import (
	"io"
)

type SubscribeMessage struct {
	Header
	Dup         bool
	Qos         byte
	TopicIdType byte
	MessageId   uint16
	TopicId     uint16
	TopicName   []byte
}

func (s *SubscribeMessage) MessageType() byte {
	return SUBSCRIBE
}

func (s *SubscribeMessage) encodeFlags() byte {
	var b byte
	if s.Dup {
		b |= DUPFLAG
	}
	b |= (s.Qos << 5) & QOSBITS
	b |= s.TopicIdType & TOPICIDTYPE
	return b
}

func (s *SubscribeMessage) decodeFlags(b byte) {
	s.Dup = (b & DUPFLAG) == DUPFLAG
	s.Qos = (b & QOSBITS) >> 5
	s.TopicIdType = b & TOPICIDTYPE
}

func (s *SubscribeMessage) Write(w io.Writer) error {
	switch s.TopicIdType {
	case 0x00, 0x02:
		s.Header.Length = uint16(len(s.TopicName) + 5)
	case 0x01:
		s.Header.Length = 7
	}
	packet := s.Header.pack()
	packet.WriteByte(SUBSCRIBE)
	packet.WriteByte(s.encodeFlags())
	packet.Write(encodeUint16(s.MessageId))
	switch s.TopicIdType {
	case 0x00, 0x02:
		packet.Write(s.TopicName)
	case 0x01:
		packet.Write(encodeUint16(s.TopicId))
	}
	_, err := packet.WriteTo(w)

	return err
}

func (s *SubscribeMessage) Unpack(b io.Reader) {
	s.decodeFlags(readByte(b))
	s.MessageId = readUint16(b)
	switch s.TopicIdType {
	case 0x00, 0x02:
		s.TopicName = make([]byte, s.Header.Length-5)
		b.Read(s.TopicName)
	case 0x01:
		s.TopicId = readUint16(b)
	}
}
