// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package database

import "android.googlesource.com/platform/tools/gpu/binary"

type metaType int

const (
	// The resource has not been built, but can be by using the request data.
	metaTypeLazy metaType = iota

	// This resource id is a link to the resource with the LinkTo identifier.
	metaTypeLink

	// This resource id points directly to data.
	metaTypeData

	// This resource id is data for a derived object.
	metaTypeDerived
)

func (t metaType) String() string {
	switch t {
	case metaTypeLazy:
		return "Lazy"
	case metaTypeLink:
		return "Link"
	case metaTypeData:
		return "Data"
	case metaTypeDerived:
		return "Derived"
	default:
		return "Unknown"
	}
}

type metadata struct {
	Type    metaType
	LinkTo  binary.ID
	Request binary.Object
}

func (m *metadata) Encode(e *binary.Encoder) error {
	if err := e.Uint8(uint8(m.Type)); err != nil {
		return err
	}
	if err := m.LinkTo.Encode(e); err != nil {
		return err
	}
	if err := e.Object(m.Request); err != nil {
		return err
	}
	return nil
}

func (m *metadata) Decode(d *binary.Decoder) error {
	ty, err := d.Uint8()
	if err != nil {
		return err
	}
	m.Type = metaType(ty)
	if err := m.LinkTo.Decode(d); err != nil {
		return err
	}
	if req, err := d.Object(); req != nil && err == nil {
		m.Request = req.(binary.Object)
	} else {
		return err
	}
	return nil
}
