package encodings

import (
	"encoding/binary"
	"io"
	"github.com/amitbet/vncproxy/common"
)

type RREEncoding struct {
	//Colors []Color
	numSubRects     uint32
	backgroundColor []byte
	subRectData     []byte
}

func (z *RREEncoding) WriteTo(w io.Writer) (n int, err error) {
	binary.Write(w, binary.BigEndian, z.numSubRects)
	if err != nil {
		return 0, err
	}

	w.Write(z.backgroundColor)
	if err != nil {
		return 0, err
	}

	w.Write(z.subRectData)

	if err != nil {
		return 0, err
	}
	b := len(z.backgroundColor) + len(z.subRectData) + 4
	return b, nil
}

func (z *RREEncoding) Type() int32 {
	return 2
}
func (z *RREEncoding) Read(pixelFmt *common.PixelFormat, rect *common.Rectangle, r *common.RfbReadHelper) (common.IEncoding, error) {
	bytesPerPixel := int(pixelFmt.BPP / 8)
	numOfSubrectangles, err := r.ReadUint32()
	if err != nil {
		return nil, err
	}
	z.numSubRects = numOfSubrectangles

	//read whole-rect background color
	z.backgroundColor, err = r.ReadBytes(bytesPerPixel)
	if err != nil {
		return nil, err
	}

	//read all individual rects (color=bytesPerPixel + x=16b + y=16b + w=16b + h=16b)
	z.subRectData, err = r.ReadBytes(int(numOfSubrectangles) * (bytesPerPixel + 8)) // x+y+w+h=8 bytes
	if err != nil {
		return nil, err
	}
	return z, nil
}
