package schema

import (
	"context"
	"fmt"
	"testing"

	"github.com/zclconf/go-cty/cty"
)

func TestBackendPrepare(t *testing.T) {
	cases := []struct {
		Name   string
		B      *Backend
		Config map[string]cty.Value
		Expect map[string]cty.Value
		Err    bool
	}{
		{
			"Basic required field",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Required: true,
						Type:     TypeString,
					},
				},
			},
			map[string]cty.Value{},
			map[string]cty.Value{},
			true,
		},

		{
			"Null config",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Required: true,
						Type:     TypeString,
					},
				},
			},
			nil,
			map[string]cty.Value{},
			true,
		},

		{
			"Basic required field set",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Required: true,
						Type:     TypeString,
					},
				},
			},
			map[string]cty.Value{
				"foo": cty.StringVal("bar"),
			},
			map[string]cty.Value{
				"foo": cty.StringVal("bar"),
			},
			false,
		},

		{
			"unused default",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Optional: true,
						Type:     TypeString,
						Default:  "baz",
					},
				},
			},
			map[string]cty.Value{
				"foo": cty.StringVal("bar"),
			},
			map[string]cty.Value{
				"foo": cty.StringVal("bar"),
			},
			false,
		},

		{
			"default",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Type:     TypeString,
						Optional: true,
						Default:  "baz",
					},
				},
			},
			map[string]cty.Value{},
			map[string]cty.Value{
				"foo": cty.StringVal("baz"),
			},
			false,
		},

		{
			"default func",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Type:     TypeString,
						Optional: true,
						DefaultFunc: func() (interface{}, error) {
							return "baz", nil
						},
					},
				},
			},
			map[string]cty.Value{},
			map[string]cty.Value{
				"foo": cty.StringVal("baz"),
			},
			false,
		},
	}

	for i, tc := range cases {
		t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) {
			cfgVal := cty.NullVal(cty.Object(map[string]cty.Type{}))
			if tc.Config != nil {
				cfgVal = cty.ObjectVal(tc.Config)
			}
			configVal, diags := tc.B.PrepareConfig(cfgVal)
			if diags.HasErrors() != tc.Err {
				for _, d := range diags {
					t.Error(d.Description())
				}
			}

			if tc.Err {
				return
			}

			expect := cty.ObjectVal(tc.Expect)
			if !expect.RawEquals(configVal) {
				t.Fatalf("\nexpected: %#v\ngot:     %#v\n", expect, configVal)
			}
		})
	}
}

func TestBackendConfigure(t *testing.T) {
	cases := []struct {
		Name   string
		B      *Backend
		Config map[string]cty.Value
		Err    bool
	}{
		{
			"Basic config",
			&Backend{
				Schema: map[string]*Schema{
					"foo": &Schema{
						Type:     TypeInt,
						Optional: true,
					},
				},

				ConfigureFunc: func(ctx context.Context) error {
					d := FromContextBackendConfig(ctx)
					if d.Get("foo").(int) != 42 {
						return fmt.Errorf("bad config data")
					}

					return nil
				},
			},
			map[string]cty.Value{
				"foo": cty.NumberIntVal(42),
			},
			false,
		},
	}

	for i, tc := range cases {
		t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) {
			diags := tc.B.Configure(cty.ObjectVal(tc.Config))
			if diags.HasErrors() != tc.Err {
				t.Errorf("wrong number of diagnostics")
			}
		})
	}
}
