// Copyright 2020 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package adt_test

import (
	"testing"

	"cuelang.org/go/cue/parser"
	"cuelang.org/go/internal/core/adt"
	"cuelang.org/go/internal/core/compile"
	"cuelang.org/go/internal/core/eval"
	"cuelang.org/go/internal/core/runtime"
)

// TestClosedness is a bootstrap and debugging test for developing the
// closedness algorithm. Most details of closedness is tested in the standard
// test suite.
func TestClosedness(t *testing.T) {
	r := runtime.New()
	ctx := eval.NewContext(r, nil)

	mkStruct := func(info adt.CloseInfo, s string) *adt.StructInfo {
		x, err := parser.ParseExpr("", s)
		if err != nil {
			t.Fatal(err)
		}
		expr, err := compile.Expr(nil, r, "", x)
		if err != nil {
			t.Fatal(err)
		}
		st := expr.Expr().(*adt.StructLit)
		st.Init()

		return &adt.StructInfo{
			StructLit: st,
			CloseInfo: info,
		}
	}

	mkRef := func(s string) adt.Expr {
		f := adt.MakeIdentLabel(r, s, "")
		return &adt.FieldReference{Label: f}
	}

	type test struct {
		f     string
		found bool
	}

	testCases := []struct {
		desc     string
		n        func() *adt.Vertex
		tests    []test
		required bool
	}{{
		desc: "simple embedding",
		// test: {
		//     a: 1
		//     c: 1
		//
		//     def
		// }
		// def: {
		//     c: 1
		//     d: 1
		// }
		n: func() *adt.Vertex {
			var (
				root  adt.CloseInfo
				embed = root.SpawnEmbed(mkRef("dummy"))
				def   = embed.SpawnRef(nil, false, mkRef("def"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(root, "{a: 1, c: 1}"),
					mkStruct(def, "{c: 1, d: 1}"),
				},
			}
		},
		tests: []test{
			{"a", true},
			{"c", true},
			{"d", true},
			{"e", false}, // allowed, but not found
		},
		required: false,
	}, {
		desc: "closing embedding",
		// test: {
		//     a: 1
		//     c: 1
		//
		//     #def
		// }
		// #def: {
		//     c: 1
		//     d: 1
		// }
		n: func() *adt.Vertex {
			var (
				root  adt.CloseInfo
				embed = root.SpawnEmbed(mkRef("dummy"))
				def   = embed.SpawnRef(nil, true, mkRef("#def"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(root, "{a: 1, c: 1}"),
					mkStruct(def, "{c: 1, d: 1}"),
				},
			}
		},
		tests: []test{
			{"a", true},
			{"c", true},
			{"d", true},
			{"e", false},
		},
		required: true,
	}, {
		desc: "narrow down definitions in subfields",
		// test: #foo
		// test: {
		//     a: 1
		//     b: 1
		// }
		// #foo: {
		//     c: #bar
		//     c: #baz
		//     c: d: 1
		//     c: e: 1
		// }
		// #bar: {
		//     d: 1
		//     e: 1
		// }
		// #baz: {
		//     d: 1
		//     f: 1
		// }
		n: func() *adt.Vertex {
			var (
				root adt.CloseInfo
				foo  = root.SpawnRef(nil, true, mkRef("#foo"))
				bar  = foo.SpawnRef(nil, true, mkRef("#bar"))
				baz  = foo.SpawnRef(nil, true, mkRef("#baz"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(root, "{a: 1, b:1}"),
					mkStruct(foo, "{d: 1, e: 1}"),
					mkStruct(bar, "{d: 1, e: 1}"),
					mkStruct(baz, "{d: 1, f: 1}"),
				},
			}
		},
		tests: []test{
			{"a", false},
			{"b", false},
			{"d", true},
			{"e", false},
			{"f", false},
		},
		required: true,
	}, {
		desc: "chained references",
		// test: foo
		// test: {
		//     a: 1
		//     b: 1
		// }
		// foo: bar
		// bar: {
		//     #baz
		//     e: 1
		// }
		// #baz: {
		//     c: 1
		//     d: 1
		// }
		n: func() *adt.Vertex {
			var (
				root adt.CloseInfo
				foo  = root.SpawnRef(nil, false, mkRef("foo"))
				bar  = foo.SpawnRef(nil, false, mkRef("bar"))
				baz  = bar.SpawnEmbed(mkRef("#baz"))
				def  = baz.SpawnRef(nil, true, mkRef("#baz"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(bar, "{e: 1}"),
					mkStruct(def, "{c: 1, d: 1}"),
					mkStruct(root, "{a: 1, c: 1}"),
				},
			}
		},
		tests: []test{
			{"a", false},
			{"c", true},
			{"d", true},
			{"e", true},
			{"f", false},
		},
		required: true,
	}, {
		desc: "conjunction embedding",
		// test: foo
		// test: {
		//     a: 1
		//     b: 1
		// }
		// foo: {
		//     #bar & #baz
		//     f: 1
		// }
		// #bar: {
		//     c: 1
		//     d: 1
		// }
		// #baz: {
		//     d: 1
		// }
		// #baz: {
		//     e: 1
		// }
		n: func() *adt.Vertex {
			var (
				root  adt.CloseInfo
				foo   = root.SpawnRef(nil, false, mkRef("foo"))
				embed = foo.SpawnEmbed(mkRef("dummy"))
				bar   = embed.SpawnRef(nil, true, mkRef("#bar"))
				baz   = embed.SpawnRef(nil, true, mkRef("#baz"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(root, "{a: 1, c: 1}"),
					mkStruct(foo, "{f: 1}"),
					mkStruct(bar, "{c: 1, d: 1}"),
					mkStruct(baz, "{d: 1}"),
					mkStruct(baz, "{e: 1}"),
				},
			}
		},
		tests: []test{
			{"a", false},
			{"c", false},
			{"d", true},
			{"e", false},
			{"f", true},
			{"g", false},
		},
		required: true,
	}, {
		desc: "local closing",
		// test: {
		//     #def
		//     a: 1
		//     b: 1
		// }
		// test: {
		//     c: 1
		//     d: 1
		// }
		// #def: {
		//     c: 1
		//     e: 1
		// }
		n: func() *adt.Vertex {
			var (
				root adt.CloseInfo
				// isolate local struct.
				spawned = root.SpawnRef(nil, false, mkRef("dummy"))
				embed   = spawned.SpawnEmbed(mkRef("dummy"))
				def     = embed.SpawnRef(nil, true, mkRef("#def"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(spawned, "{a: 1, b: 1}"),
					mkStruct(root, "{c: 1, d: 1}"),
					mkStruct(def, "{c: 1, e: 1}"),
				},
			}
		},
		tests: []test{
			{"d", false},
			{"a", true},
			{"c", true},
			{"e", true},
			{"f", false},
		},
		required: true,
	}, {
		desc: "branching",
		// test: #foo
		// #foo: {
		//     c: #bar1
		//     c: #bar2
		// }
		// #bar1: {
		//     d: #baz1
		//     d: #baz2
		// }
		// #bar2: {
		//     d: #baz3
		//     d: {#baz4}
		// }
		// #baz1: e: 1
		// #baz2: e: 1
		// #baz3: e: 1
		// #baz4: e: 1
		n: func() *adt.Vertex {
			var (
				root adt.CloseInfo
				foo  = root.SpawnRef(nil, true, mkRef("#foo"))
				bar1 = foo.SpawnRef(nil, true, mkRef("#bar1"))
				bar2 = foo.SpawnRef(nil, true, mkRef("#bar2"))
				baz1 = bar1.SpawnRef(nil, true, mkRef("#baz1"))
				baz2 = bar1.SpawnRef(nil, true, mkRef("#baz2"))
				baz3 = bar2.SpawnRef(nil, true, mkRef("#baz3"))
				spw3 = bar2.SpawnRef(nil, false, mkRef("spw3"))
				emb2 = spw3.SpawnEmbed(mkRef("emb"))
				baz4 = emb2.SpawnRef(nil, true, mkRef("#baz4"))
			)
			return &adt.Vertex{
				Structs: []*adt.StructInfo{
					mkStruct(root, "{}"),
					mkStruct(foo, "{}"),
					mkStruct(bar1, "{}"),
					mkStruct(bar2, "{}"),
					mkStruct(baz1, "{e: 1, f: 1, g: 1}"),
					mkStruct(baz2, "{e: 1, f: 1, g: 1}"),
					mkStruct(baz3, "{e: 1, g: 1}"),
					mkStruct(baz4, "{e: 1, f: 1}"),
				},
			}
		},
		tests: []test{
			{"a", false},
			{"e", true},
			{"f", false},
			{"g", false},
		},
		required: true,
	}}
	// TODO:
	// dt1: {
	// 	#Test: {
	// 		#SSH:   !~"^ssh://"
	// 		source: #SSH | #Test
	// 	}

	// 	foo: #Test & {
	// 		source: "http://blablabla"
	// 	}

	// 	bar: #Test & {
	// 		source: foo
	// 	}
	// }
	//
	// -----
	for _, tc := range testCases {
		t.Run(tc.desc, func(t *testing.T) {
			for _, sub := range tc.tests {
				t.Run(sub.f, func(t *testing.T) {
					f := adt.MakeIdentLabel(r, sub.f, "")

					n := tc.n()
					ok, required := adt.Accept(ctx, n, f)
					if ok != sub.found || required != tc.required {
						t.Errorf("got (%v, %v); want (%v, %v)",
							ok, required, sub.found, tc.required)
					}
				})
			}
		})
	}
}
