// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// +build !build_with_native_toolchain

package util

import (
	"fmt"
	"gen/types"
	"math/rand"
	"strconv"
)

func RandomValues(typ types.FidlType) ValueGenerator {
	return &randomValueGenerator{
		typ: typ,
		r:   rand.New(rand.NewSource(0)),
	}
}

func SequentialValues(typ types.FidlType, start int) ValueGenerator {
	return &sequentialValueGenerator{
		typ:     typ,
		format:  "%d",
		nextVal: uint64(start),
	}
}

func SequentialHexValues(typ types.FidlType, start int) ValueGenerator {
	return &sequentialValueGenerator{
		typ:     typ,
		format:  "%#02x",
		nextVal: uint64(start),
	}
}

type ValueGenerator interface {
	next() string
}

type randomValueGenerator struct {
	typ types.FidlType
	r   *rand.Rand
}

func (gen *randomValueGenerator) next() string {
	switch gen.typ {
	case types.Uint8:
		return strconv.FormatUint(uint64(uint8(gen.r.Uint32())), 10)
	case types.Uint16:
		return strconv.FormatUint(uint64(uint16(gen.r.Uint32())), 10)
	case types.Uint32:
		return strconv.FormatUint(uint64(gen.r.Uint32()), 10)
	case types.Uint64:
		return strconv.FormatUint(gen.r.Uint64(), 10)
	case types.Int8:
		return strconv.FormatInt(int64(int8(gen.r.Uint32())), 10)
	case types.Int16:
		return strconv.FormatInt(int64(int16(gen.r.Uint32())), 10)
	case types.Int32:
		return strconv.FormatInt(int64(uint32(gen.r.Uint32())), 10)
	case types.Int64:
		return strconv.FormatInt(int64(gen.r.Uint64()), 10)
	case types.Float32:
		return strconv.FormatFloat(float64(gen.r.Float32()), 'f', -1, 32)
	case types.Float64:
		return strconv.FormatFloat(float64(gen.r.Float64()), 'f', -1, 32)
	default:
		panic("not supported")
	}
}

type sequentialValueGenerator struct {
	typ     types.FidlType
	format  string
	nextVal uint64
}

func (gen *sequentialValueGenerator) next() string {
	lastVal := gen.nextVal
	gen.nextVal += 1

	var typedValue interface{}
	switch gen.typ {
	case types.Uint8:
		typedValue = uint8(lastVal)
	case types.Uint16:
		typedValue = uint16(lastVal)
	case types.Uint32:
		typedValue = uint32(lastVal)
	case types.Uint64:
		typedValue = lastVal
	case types.Int8:
		typedValue = int8(lastVal)
	case types.Int16:
		typedValue = int16(lastVal)
	case types.Int32:
		typedValue = int32(lastVal)
	case types.Int64:
		typedValue = int64(lastVal)
	default:
		panic("not supported")
	}
	return fmt.Sprintf(gen.format, typedValue)
}
