package ast

import (
	"bytes"
	"encoding/json"
	"fmt"
	"strconv"
	"strings"
)

func removeQuotes(s string) string {
	s = strings.TrimSpace(s)

	if s == `""` {
		return ""
	}
	if s == `''` {
		return ""
	}

	if len(s) >= 2 && s[0] == '"' && s[len(s)-1] == '"' {
		return s[1 : len(s)-1]
	}
	if len(s) >= 2 && s[0] == '\'' && s[len(s)-1] == '\'' {
		return s[1 : len(s)-1]
	}

	return s
}

func atof(s string) float64 {
	f, err := strconv.ParseFloat(s, 64)
	if err != nil {
		panic(err)
	}

	return f
}

// Atos - ASTree to string
// Typically using for debug
func Atos(node Node) string {
	j, err := json.Marshal(node)
	if err != nil {
		panic(err)
	}
	var out bytes.Buffer
	err = json.Indent(&out, j, "", "\t")
	if err != nil {
		panic(err)
	}
	var str string
	str += fmt.Sprint("==== START OF AST tree ====\n")
	str += out.String()
	str += TypesTree(node)
	str += fmt.Sprint("==== END OF AST tree ====\n")
	return str
}

// TypesTree - return tree of types for AST node
func TypesTree(node Node) (str string) {
	str += fmt.Sprintf("\nTypes tree:\n")
	str += typesTree(node, 0)
	return str
}

func typesTree(node Node, depth int) (str string) {
	if node == (Node)(nil) {
		return ""
	}
	for i := 0; i < depth; i++ {
		str += "\t"
	}
	str += fmt.Sprintf("%T\n", node)
	depth++
	if len(node.Children()) > 0 {
		for _, n := range node.Children() {
			str += typesTree(n, depth)
		}
	}
	return str
}
