package fidl

import (
	"reflect"
	"strconv"
	"strings"
)

// Usage: printf("abc {} def {} ...", 3, X{4})
func printf(format string, args ...interface{}) {
	var argStrs []string
	for _, arg := range args {
		argStrs = append(argStrs, buildValueString(reflect.ValueOf(arg)))
	}
	parts := strings.Split(format, "{}")
	argIndex := 0
	strIndex := 0
	out := ""
	for strIndex < len(parts) {
		if argIndex >= strIndex {
			out += parts[strIndex]
			strIndex++
		} else {
			out += argStrs[argIndex]
			argIndex++
		}
	}
	print(out)
}

func buildTypeString(rt reflect.Type) string {
	switch rt.Kind() {
	case reflect.Bool:
		fallthrough
	case reflect.Int:
		fallthrough
	case reflect.Int8:
		fallthrough
	case reflect.Int16:
		fallthrough
	case reflect.Int32:
		fallthrough
	case reflect.Int64:
		fallthrough
	case reflect.Uint:
		fallthrough
	case reflect.Uint8:
		fallthrough
	case reflect.Uint16:
		fallthrough
	case reflect.Uint32:
		fallthrough
	case reflect.Uint64:
		fallthrough
	case reflect.Uintptr:
		fallthrough
	case reflect.Float32:
		fallthrough
	case reflect.Float64:
		fallthrough
	case reflect.String:
		return rt.Kind().String()
	case reflect.Array:
		return "[" + strconv.FormatUint(uint64(rt.Size()), 10) + "]" + buildTypeString(rt.Elem())
	case reflect.Slice:
		return "[]" + buildTypeString(rt.Elem())
	case reflect.Map:
		return "[" + buildTypeString(rt.Key()) + "]" + buildTypeString(rt.Elem())
	case reflect.Ptr:
		return "*" + buildTypeString(rt.Elem())
	case reflect.Interface:
		fallthrough
	case reflect.Struct:
		return rt.Name()
	case reflect.Complex64:
		return "[complex64]"
	case reflect.Complex128:
		return "[complex128]"
	case reflect.Chan:
		return "[chan]"
	case reflect.Func:
		return "[func]"
	case reflect.UnsafePointer:
		return "[unsafeptr]"
	default:
		panic("unsupported type kind " + strconv.Itoa(int(rt.Kind())))
	}
}

func buildValueString(rv reflect.Value) string {
	switch rv.Kind() {
	case reflect.Bool:
		return strconv.FormatBool(rv.Bool())
	case reflect.Int:
		fallthrough
	case reflect.Int8:
		fallthrough
	case reflect.Int16:
		fallthrough
	case reflect.Int32:
		fallthrough
	case reflect.Int64:
		return strconv.FormatInt(rv.Int(), 10)
	case reflect.Uint:
		fallthrough
	case reflect.Uint8:
		fallthrough
	case reflect.Uint16:
		fallthrough
	case reflect.Uint32:
		fallthrough
	case reflect.Uint64:
		return strconv.FormatUint(rv.Uint(), 10)
	case reflect.Uintptr:
		return "0x" + strconv.FormatUint(rv.Uint(), 16)
	case reflect.Float32:
		fallthrough
	case reflect.Float64:
		return strconv.FormatFloat(rv.Float(), 'f', -1, 64)
	case reflect.String:
		return rv.String() // TODO quote the string
	case reflect.Array:
		fallthrough
	case reflect.Slice:
		var valueStrs []string
		for i := 0; i < rv.Len(); i++ {
			valueStrs = append(valueStrs, buildValueString(rv.Index(i)))
		}
		return buildTypeString(rv.Type()) + "{" + strings.Join(valueStrs, ", ") + "}"
	case reflect.Map:
		iter := rv.MapRange()
		var itemStrs []string
		for iter.Next() {
			itemStrs = append(itemStrs, buildValueString(iter.Key())+": "+buildValueString(iter.Value()))
		}
		return buildTypeString(rv.Type()) + "{" + strings.Join(itemStrs, ", ") + "}"
	case reflect.Interface:
		fallthrough
	case reflect.Ptr:
		if rv.IsNil() {
			return "nil"
		} else {
			return buildValueString(rv.Elem())
		}
	case reflect.Struct:
		var itemStrs []string
		for i := 0; i < rv.NumField(); i++ {
			itemStrs = append(itemStrs, rv.Type().Field(i).Name+": "+buildValueString(rv.Field(i)))
		}
		return buildTypeString(rv.Type()) + "{" + strings.Join(itemStrs, ", ") + "}"
	case reflect.Complex64:
		return "[complex64]"
	case reflect.Complex128:
		return "[complex128]"
	case reflect.Chan:
		return "[chan]"
	case reflect.Func:
		return "[func]"
	case reflect.UnsafePointer:
		return "[unsafeptr]"
	default:
		panic("unsupported value kind " + strconv.Itoa(int(rv.Kind())))
	}
}
