package render_test

import (
	"errors"
	"testing"

	"github.com/derailed/k9s/internal/render"
	"github.com/stretchr/testify/assert"
)

func TestPolicyResMerge(t *testing.T) {
	uu := map[string]struct {
		p1, p2, e render.PolicyRes
		err       error
	}{
		"simple": {
			p1: render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"get"}),
			p2: render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"patch"}),
			e:  render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"get", "patch"}),
		},
		"dups": {
			p1: render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"get"}),
			p2: render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"get", "delete"}),
			e:  render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"get", "delete"}),
		},
		"mismatch": {
			p1:  render.NewPolicyRes("fred", "blee", "deployments", "apps/v1", []string{"get"}),
			p2:  render.NewPolicyRes("fred", "blee", "statefulsets", "apps/v1", []string{"get", "delete"}),
			err: errors.New("policy mismatch apps/v1/deployments vs apps/v1/statefulsets"),
		},
	}

	for k := range uu {
		u := uu[k]
		t.Run(k, func(t *testing.T) {
			e, err := u.p1.Merge(u.p2)
			assert.Equal(t, u.err, err)
			assert.Equal(t, u.e, e)
		})
	}
}

func TestPolicyRender(t *testing.T) {
	var p render.Policy

	var r render.Row
	o := render.PolicyRes{
		Namespace:      "blee",
		Binding:        "fred",
		Resource:       "res",
		Group:          "grp",
		ResourceName:   "bob",
		NonResourceURL: "/blee",
		Verbs:          []string{"get", "list", "watch"},
	}

	assert.Nil(t, p.Render(o, "fred", &r))
	assert.Equal(t, "blee/res", r.ID)
	assert.Equal(t, render.Fields{
		"blee",
		"res",
		"grp",
		"fred",
		"[green::b] ✓ [::]",
		"[green::b] ✓ [::]",
		"[green::b] ✓ [::]",
		"[orangered::b] × [::]",
		"[orangered::b] × [::]",
		"[orangered::b] × [::]",
		"[orangered::b] × [::]",
		"[orangered::b] × [::]",
		"",
		"",
	}, r.Fields)
}
