package sarama

import "time"

//AlterConfigsResponse is a reponse type for alter config
type AlterConfigsResponse struct {
	ThrottleTime time.Duration
	Resources    []*AlterConfigsResourceResponse
}

//AlterConfigsResourceResponse is a reponse type for alter config resource
type AlterConfigsResourceResponse struct {
	ErrorCode int16
	ErrorMsg  string
	Type      ConfigResourceType
	Name      string
}

func (a *AlterConfigsResponse) encode(pe packetEncoder) error {
	pe.putInt32(int32(a.ThrottleTime / time.Millisecond))

	if err := pe.putArrayLength(len(a.Resources)); err != nil {
		return err
	}

	for i := range a.Resources {
		pe.putInt16(a.Resources[i].ErrorCode)
		err := pe.putString(a.Resources[i].ErrorMsg)
		if err != nil {
			return nil
		}
		pe.putInt8(int8(a.Resources[i].Type))
		err = pe.putString(a.Resources[i].Name)
		if err != nil {
			return nil
		}
	}

	return nil
}

func (a *AlterConfigsResponse) decode(pd packetDecoder, version int16) error {
	throttleTime, err := pd.getInt32()
	if err != nil {
		return err
	}
	a.ThrottleTime = time.Duration(throttleTime) * time.Millisecond

	responseCount, err := pd.getArrayLength()
	if err != nil {
		return err
	}

	a.Resources = make([]*AlterConfigsResourceResponse, responseCount)

	for i := range a.Resources {
		a.Resources[i] = new(AlterConfigsResourceResponse)

		errCode, err := pd.getInt16()
		if err != nil {
			return err
		}
		a.Resources[i].ErrorCode = errCode

		e, err := pd.getString()
		if err != nil {
			return err
		}
		a.Resources[i].ErrorMsg = e

		t, err := pd.getInt8()
		if err != nil {
			return err
		}
		a.Resources[i].Type = ConfigResourceType(t)

		name, err := pd.getString()
		if err != nil {
			return err
		}
		a.Resources[i].Name = name
	}

	return nil
}

func (a *AlterConfigsResponse) key() int16 {
	return 32
}

func (a *AlterConfigsResponse) version() int16 {
	return 0
}

func (a *AlterConfigsResponse) requiredVersion() KafkaVersion {
	return V0_11_0_0
}
