package jpath

import (
	"fmt"
	. "github.com/pelletier/go-toml"
	"testing"
)

func assertQuery(t *testing.T, toml, query string, ref []interface{}) {
	tree, err := Load(toml)
	if err != nil {
		t.Errorf("Non-nil toml parse error: %v", err)
		return
	}
	_, flow := lex(query)
	if err != nil {
		t.Errorf("Non-nil query lex error: %v", err)
		return
	}
	path := parse(flow)
	result := path.Call(tree)
	assertValue(t, result, ref, "((" + query + ")) -> ")
}

func assertValue(t *testing.T, result, ref interface{}, location string) {
	switch node := ref.(type) {
	case []interface{}:
		if resultNode, ok := result.([]interface{}); !ok {
			t.Errorf("{%s} result value not of type %T: %T",
				location, node, resultNode)
		} else {
      if len(node) != len(resultNode) {
        t.Errorf("{%s} lengths do not match: %v vs %v",
          location, node, resultNode)
      } else {
        for i, v := range node {
          assertValue(t, resultNode[i], v, fmt.Sprintf("%s[%d]", location, i))
        }
      }
		}
	case map[string]interface{}:
		if resultNode, ok := result.(*TomlTree); !ok {
			t.Errorf("{%s} result value not of type %T: %T",
				location, node, resultNode)
		} else {
			for k, v := range node {
				assertValue(t, resultNode.GetPath([]string{k}), v, location+"."+k)
			}
		}
	case int64:
		if resultNode, ok := result.(int64); !ok {
			t.Errorf("{%s} result value not of type %T: %T",
				location, node, resultNode)
		} else {
			if node != resultNode {
				t.Errorf("{%s} result value does not match", location)
			}
		}
	case string:
		if resultNode, ok := result.(string); !ok {
			t.Errorf("{%s} result value not of type %T: %T",
				location, node, resultNode)
		} else {
			if node != resultNode {
				t.Errorf("{%s} result value does not match", location)
			}
		}
	default:
		if fmt.Sprintf("%v", node) != fmt.Sprintf("%v", ref) {
			t.Errorf("{%s} result value does not match: %v != %v",
				location, node, ref)
		}
	}
}

func TestQueryRoot(t *testing.T) {
	assertQuery(t,
		"a = 42",
		"$",
		[]interface{}{
			map[string]interface{}{
				"a": int64(42),
			},
		})
}

func TestQueryKey(t *testing.T) {
  assertQuery(t,
    "[foo]\na = 42",
    "$.foo.a",
		[]interface{}{
		  int64(42),
	  })
}

func TestQueryKeyString(t *testing.T) {
  assertQuery(t,
    "[foo]\na = 42",
    "$.foo['a']",
		[]interface{}{
		  int64(42),
	  })
}

func TestQueryIndex(t *testing.T) {
  assertQuery(t,
    "[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
    "$.foo.a[0]",
		[]interface{}{
		  int64(1),
	  })
}

func TestQuerySliceRange(t *testing.T) {
  assertQuery(t,
    "[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
    "$.foo.a[0:5]",
		[]interface{}{
		  int64(1),
		  int64(2),
		  int64(3),
		  int64(4),
		  int64(5),
	  })
}

func TestQuerySliceStep(t *testing.T) {
  assertQuery(t,
    "[foo]\na = [1,2,3,4,5,6,7,8,9,0]",
    "$.foo.a[0:5:2]",
		[]interface{}{
		  int64(1),
		  int64(3),
		  int64(5),
	  })
}

func TestQueryAny(t *testing.T) {
  assertQuery(t,
    "[foo.bar]\na=1\nb=2\n[foo.baz]\na=3\nb=4",
    "$.foo.*",
		[]interface{}{
		  map[string]interface{}{
		    "a": int64(1),
		    "b": int64(2),
      },
		  map[string]interface{}{
		    "a": int64(3),
		    "b": int64(4),
      },
	  })
}
func TestQueryUnionSimple(t *testing.T) {
  assertQuery(t,
    "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
    "$.*[bar,foo]",
		[]interface{}{
		  map[string]interface{}{
		    "a": int64(1),
		    "b": int64(2),
      },
		  map[string]interface{}{
		    "a": int64(3),
		    "b": int64(4),
      },
		  map[string]interface{}{
		    "a": int64(5),
		    "b": int64(6),
      },
	  })
}

func TestQueryRecursionAll(t *testing.T) {
  assertQuery(t,
    "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
    "$..*",
		[]interface{}{
		  map[string]interface{}{
		    "bar": map[string]interface{}{
          "a": int64(1),
          "b": int64(2),
        },
      },
		  map[string]interface{}{
		    "a": int64(1),
		    "b": int64(2),
      },
		  int64(1),
		  int64(2),
		  map[string]interface{}{
        "foo": map[string]interface{}{
          "a": int64(3),
          "b": int64(4),
        },
      },
		  map[string]interface{}{
		    "a": int64(3),
		    "b": int64(4),
      },
		  int64(3),
		  int64(4),
		  map[string]interface{}{
        "foo": map[string]interface{}{
          "a": int64(5),
          "b": int64(6),
        },
      },
		  map[string]interface{}{
		    "a": int64(5),
		    "b": int64(6),
      },
		  int64(5),
		  int64(6),
	  })
}

func TestQueryRecursionUnionSimple(t *testing.T) {
  assertQuery(t,
    "[foo.bar]\na=1\nb=2\n[baz.foo]\na=3\nb=4\n[gorf.foo]\na=5\nb=6",
    "$..['foo','bar']",
		[]interface{}{
		  map[string]interface{}{
		    "a": int64(1),
		    "b": int64(2),
      },
		  map[string]interface{}{
		    "a": int64(3),
		    "b": int64(4),
      },
		  map[string]interface{}{
		    "a": int64(5),
		    "b": int64(6),
      },
	  })
}
