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

package eval

import (
	"bignum"
	"fmt"
)

type Value interface {
	String() string
	// Assign copies another value into this one.  It should
	// assume that the other value satisfies the same specific
	// value interface (BoolValue, etc.), but must not assume
	// anything about its specific type.
	Assign(t *Thread, o Value)
}

type BoolValue interface {
	Value
	Get(*Thread) bool
	Set(*Thread, bool)
}

type UintValue interface {
	Value
	Get(*Thread) uint64
	Set(*Thread, uint64)
}

type IntValue interface {
	Value
	Get(*Thread) int64
	Set(*Thread, int64)
}

// TODO(austin) IdealIntValue and IdealFloatValue should not exist
// because ideals are not l-values.
type IdealIntValue interface {
	Value
	Get() *bignum.Integer
}

type FloatValue interface {
	Value
	Get(*Thread) float64
	Set(*Thread, float64)
}

type IdealFloatValue interface {
	Value
	Get() *bignum.Rational
}

type StringValue interface {
	Value
	Get(*Thread) string
	Set(*Thread, string)
}

type ArrayValue interface {
	Value
	// TODO(austin) Get() is here for uniformity, but is
	// completely useless.  If a lot of other types have similarly
	// useless Get methods, just special-case these uses.
	Get(*Thread) ArrayValue
	Elem(*Thread, int64) Value
	// Sub returns an ArrayValue backed by the same array that
	// starts from element i and has length len.
	Sub(i int64, len int64) ArrayValue
}

type StructValue interface {
	Value
	// TODO(austin) This is another useless Get()
	Get(*Thread) StructValue
	Field(*Thread, int) Value
}

type PtrValue interface {
	Value
	Get(*Thread) Value
	Set(*Thread, Value)
}

type Func interface {
	NewFrame() *Frame
	Call(*Thread)
}

type FuncValue interface {
	Value
	Get(*Thread) Func
	Set(*Thread, Func)
}

type Interface struct {
	Type  Type
	Value Value
}

type InterfaceValue interface {
	Value
	Get(*Thread) Interface
	Set(*Thread, Interface)
}

type Slice struct {
	Base     ArrayValue
	Len, Cap int64
}

type SliceValue interface {
	Value
	Get(*Thread) Slice
	Set(*Thread, Slice)
}

type Map interface {
	Len(*Thread) int64
	// Retrieve an element from the map, returning nil if it does
	// not exist.
	Elem(t *Thread, key interface{}) Value
	// Set an entry in the map.  If val is nil, delete the entry.
	SetElem(t *Thread, key interface{}, val Value)
	// TODO(austin)  Perhaps there should be an iterator interface instead.
	Iter(func(key interface{}, val Value) bool)
}

type MapValue interface {
	Value
	Get(*Thread) Map
	Set(*Thread, Map)
}

/*
 * Bool
 */

type boolV bool

func (v *boolV) String() string { return fmt.Sprint(*v) }

func (v *boolV) Assign(t *Thread, o Value) { *v = boolV(o.(BoolValue).Get(t)) }

func (v *boolV) Get(*Thread) bool { return bool(*v) }

func (v *boolV) Set(t *Thread, x bool) { *v = boolV(x) }

/*
 * Uint
 */

type uint8V uint8

func (v *uint8V) String() string { return fmt.Sprint(*v) }

func (v *uint8V) Assign(t *Thread, o Value) { *v = uint8V(o.(UintValue).Get(t)) }

func (v *uint8V) Get(*Thread) uint64 { return uint64(*v) }

func (v *uint8V) Set(t *Thread, x uint64) { *v = uint8V(x) }

type uint16V uint16

func (v *uint16V) String() string { return fmt.Sprint(*v) }

func (v *uint16V) Assign(t *Thread, o Value) { *v = uint16V(o.(UintValue).Get(t)) }

func (v *uint16V) Get(*Thread) uint64 { return uint64(*v) }

func (v *uint16V) Set(t *Thread, x uint64) { *v = uint16V(x) }

type uint32V uint32

func (v *uint32V) String() string { return fmt.Sprint(*v) }

func (v *uint32V) Assign(t *Thread, o Value) { *v = uint32V(o.(UintValue).Get(t)) }

func (v *uint32V) Get(*Thread) uint64 { return uint64(*v) }

func (v *uint32V) Set(t *Thread, x uint64) { *v = uint32V(x) }

type uint64V uint64

func (v *uint64V) String() string { return fmt.Sprint(*v) }

func (v *uint64V) Assign(t *Thread, o Value) { *v = uint64V(o.(UintValue).Get(t)) }

func (v *uint64V) Get(*Thread) uint64 { return uint64(*v) }

func (v *uint64V) Set(t *Thread, x uint64) { *v = uint64V(x) }

type uintV uint

func (v *uintV) String() string { return fmt.Sprint(*v) }

func (v *uintV) Assign(t *Thread, o Value) { *v = uintV(o.(UintValue).Get(t)) }

func (v *uintV) Get(*Thread) uint64 { return uint64(*v) }

func (v *uintV) Set(t *Thread, x uint64) { *v = uintV(x) }

type uintptrV uintptr

func (v *uintptrV) String() string { return fmt.Sprint(*v) }

func (v *uintptrV) Assign(t *Thread, o Value) { *v = uintptrV(o.(UintValue).Get(t)) }

func (v *uintptrV) Get(*Thread) uint64 { return uint64(*v) }

func (v *uintptrV) Set(t *Thread, x uint64) { *v = uintptrV(x) }

/*
 * Int
 */

type int8V int8

func (v *int8V) String() string { return fmt.Sprint(*v) }

func (v *int8V) Assign(t *Thread, o Value) { *v = int8V(o.(IntValue).Get(t)) }

func (v *int8V) Get(*Thread) int64 { return int64(*v) }

func (v *int8V) Set(t *Thread, x int64) { *v = int8V(x) }

type int16V int16

func (v *int16V) String() string { return fmt.Sprint(*v) }

func (v *int16V) Assign(t *Thread, o Value) { *v = int16V(o.(IntValue).Get(t)) }

func (v *int16V) Get(*Thread) int64 { return int64(*v) }

func (v *int16V) Set(t *Thread, x int64) { *v = int16V(x) }

type int32V int32

func (v *int32V) String() string { return fmt.Sprint(*v) }

func (v *int32V) Assign(t *Thread, o Value) { *v = int32V(o.(IntValue).Get(t)) }

func (v *int32V) Get(*Thread) int64 { return int64(*v) }

func (v *int32V) Set(t *Thread, x int64) { *v = int32V(x) }

type int64V int64

func (v *int64V) String() string { return fmt.Sprint(*v) }

func (v *int64V) Assign(t *Thread, o Value) { *v = int64V(o.(IntValue).Get(t)) }

func (v *int64V) Get(*Thread) int64 { return int64(*v) }

func (v *int64V) Set(t *Thread, x int64) { *v = int64V(x) }

type intV int

func (v *intV) String() string { return fmt.Sprint(*v) }

func (v *intV) Assign(t *Thread, o Value) { *v = intV(o.(IntValue).Get(t)) }

func (v *intV) Get(*Thread) int64 { return int64(*v) }

func (v *intV) Set(t *Thread, x int64) { *v = intV(x) }

/*
 * Ideal int
 */

type idealIntV struct {
	V *bignum.Integer
}

func (v *idealIntV) String() string { return v.V.String() }

func (v *idealIntV) Assign(t *Thread, o Value) {
	v.V = o.(IdealIntValue).Get()
}

func (v *idealIntV) Get() *bignum.Integer { return v.V }

/*
 * Float
 */

type float32V float32

func (v *float32V) String() string { return fmt.Sprint(*v) }

func (v *float32V) Assign(t *Thread, o Value) { *v = float32V(o.(FloatValue).Get(t)) }

func (v *float32V) Get(*Thread) float64 { return float64(*v) }

func (v *float32V) Set(t *Thread, x float64) { *v = float32V(x) }

type float64V float64

func (v *float64V) String() string { return fmt.Sprint(*v) }

func (v *float64V) Assign(t *Thread, o Value) { *v = float64V(o.(FloatValue).Get(t)) }

func (v *float64V) Get(*Thread) float64 { return float64(*v) }

func (v *float64V) Set(t *Thread, x float64) { *v = float64V(x) }

type floatV float

func (v *floatV) String() string { return fmt.Sprint(*v) }

func (v *floatV) Assign(t *Thread, o Value) { *v = floatV(o.(FloatValue).Get(t)) }

func (v *floatV) Get(*Thread) float64 { return float64(*v) }

func (v *floatV) Set(t *Thread, x float64) { *v = floatV(x) }

/*
 * Ideal float
 */

type idealFloatV struct {
	V *bignum.Rational
}

func (v *idealFloatV) String() string { return ratToString(v.V) }

func (v *idealFloatV) Assign(t *Thread, o Value) {
	v.V = o.(IdealFloatValue).Get()
}

func (v *idealFloatV) Get() *bignum.Rational { return v.V }

/*
 * String
 */

type stringV string

func (v *stringV) String() string { return fmt.Sprint(*v) }

func (v *stringV) Assign(t *Thread, o Value) { *v = stringV(o.(StringValue).Get(t)) }

func (v *stringV) Get(*Thread) string { return string(*v) }

func (v *stringV) Set(t *Thread, x string) { *v = stringV(x) }

/*
 * Array
 */

type arrayV []Value

func (v *arrayV) String() string {
	res := "{"
	for i, e := range *v {
		if i > 0 {
			res += ", "
		}
		res += e.String()
	}
	return res + "}"
}

func (v *arrayV) Assign(t *Thread, o Value) {
	oa := o.(ArrayValue)
	l := int64(len(*v))
	for i := int64(0); i < l; i++ {
		(*v)[i].Assign(t, oa.Elem(t, i))
	}
}

func (v *arrayV) Get(*Thread) ArrayValue { return v }

func (v *arrayV) Elem(t *Thread, i int64) Value {
	return (*v)[i]
}

func (v *arrayV) Sub(i int64, len int64) ArrayValue {
	res := (*v)[i : i+len]
	return &res
}

/*
 * Struct
 */

type structV []Value

// TODO(austin) Should these methods (and arrayV's) be on structV
// instead of *structV?
func (v *structV) String() string {
	res := "{"
	for i, v := range *v {
		if i > 0 {
			res += ", "
		}
		res += v.String()
	}
	return res + "}"
}

func (v *structV) Assign(t *Thread, o Value) {
	oa := o.(StructValue)
	l := len(*v)
	for i := 0; i < l; i++ {
		(*v)[i].Assign(t, oa.Field(t, i))
	}
}

func (v *structV) Get(*Thread) StructValue { return v }

func (v *structV) Field(t *Thread, i int) Value {
	return (*v)[i]
}

/*
 * Pointer
 */

type ptrV struct {
	// nil if the pointer is nil
	target Value
}

func (v *ptrV) String() string {
	if v.target == nil {
		return "<nil>"
	}
	return "&" + v.target.String()
}

func (v *ptrV) Assign(t *Thread, o Value) { v.target = o.(PtrValue).Get(t) }

func (v *ptrV) Get(*Thread) Value { return v.target }

func (v *ptrV) Set(t *Thread, x Value) { v.target = x }

/*
 * Functions
 */

type funcV struct {
	target Func
}

func (v *funcV) String() string {
	// TODO(austin) Rob wants to see the definition
	return "func {...}"
}

func (v *funcV) Assign(t *Thread, o Value) { v.target = o.(FuncValue).Get(t) }

func (v *funcV) Get(*Thread) Func { return v.target }

func (v *funcV) Set(t *Thread, x Func) { v.target = x }

/*
 * Interfaces
 */

type interfaceV struct {
	Interface
}

func (v *interfaceV) String() string {
	if v.Type == nil || v.Value == nil {
		return "<nil>"
	}
	return v.Value.String()
}

func (v *interfaceV) Assign(t *Thread, o Value) {
	v.Interface = o.(InterfaceValue).Get(t)
}

func (v *interfaceV) Get(*Thread) Interface { return v.Interface }

func (v *interfaceV) Set(t *Thread, x Interface) {
	v.Interface = x
}

/*
 * Slices
 */

type sliceV struct {
	Slice
}

func (v *sliceV) String() string {
	if v.Base == nil {
		return "<nil>"
	}
	return v.Base.Sub(0, v.Len).String()
}

func (v *sliceV) Assign(t *Thread, o Value) { v.Slice = o.(SliceValue).Get(t) }

func (v *sliceV) Get(*Thread) Slice { return v.Slice }

func (v *sliceV) Set(t *Thread, x Slice) { v.Slice = x }

/*
 * Maps
 */

type mapV struct {
	target Map
}

func (v *mapV) String() string {
	if v.target == nil {
		return "<nil>"
	}
	res := "map["
	i := 0
	v.target.Iter(func(key interface{}, val Value) bool {
		if i > 0 {
			res += ", "
		}
		i++
		res += fmt.Sprint(key) + ":" + val.String()
		return true
	})
	return res + "]"
}

func (v *mapV) Assign(t *Thread, o Value) { v.target = o.(MapValue).Get(t) }

func (v *mapV) Get(*Thread) Map { return v.target }

func (v *mapV) Set(t *Thread, x Map) { v.target = x }

type evalMap map[interface{}]Value

func (m evalMap) Len(t *Thread) int64 { return int64(len(m)) }

func (m evalMap) Elem(t *Thread, key interface{}) Value {
	if v, ok := m[key]; ok {
		return v
	}
	return nil
}

func (m evalMap) SetElem(t *Thread, key interface{}, val Value) {
	if val == nil {
		m[key] = nil, false
	} else {
		m[key] = val
	}
}

func (m evalMap) Iter(cb func(key interface{}, val Value) bool) {
	for k, v := range m {
		if !cb(k, v) {
			break
		}
	}
}

/*
 * Multi-values
 */

type multiV []Value

func (v multiV) String() string {
	res := "("
	for i, v := range v {
		if i > 0 {
			res += ", "
		}
		res += v.String()
	}
	return res + ")"
}

func (v multiV) Assign(t *Thread, o Value) {
	omv := o.(multiV)
	for i := range v {
		v[i].Assign(t, omv[i])
	}
}

/*
 * Universal constants
 */

// TODO(austin) Nothing complains if I accidentally define init with
// arguments.  Is this intentional?
func init() {
	s := universe

	true := boolV(true)
	s.DefineConst("true", universePos, BoolType, &true)
	false := boolV(false)
	s.DefineConst("false", universePos, BoolType, &false)
}
