package resultstore

import (
	"encoding/json"
	"testing"

	"fuchsia.googlesource.com/infra/infra/fxtesting"
)

func TestContext(t *testing.T) {
	setup := func(t *testing.T) (Context, fxtesting.T) {
		return NewContext(), fxtesting.T{t}
	}

	t.Run("SetAuthToken", func(t *testing.T) {
		t.Run("should store the auth token", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetAuthToken("token"), "could not set auth token")
		})
		t.Run("should error if overwriting the auth token", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetAuthToken("token"), "could not set auth token")
			// Same value should not error
			fxt.Assert(ctx.SetAuthToken("token"), "could not set auth token")
			fxt.Assert(!ctx.SetAuthToken("new_token"), "should not have been able to overwrite the auth token")
		})
	})

	t.Run("AuthToken", func(t *testing.T) {
		t.Run("should return the auth token", func(t *testing.T) {
			ctx, fxt := setup(t)

			// Should start off empty.
			token := ctx.AuthToken()
			fxt.Assert(token == "", "auth token should be empty. Got %s", token)
			fxt.Assert(ctx.SetAuthToken("token"), "unable to set auth token")
			token = ctx.AuthToken()
			fxt.Assert(token == "token", "got unexpected value for auth token: %s", token)
		})
	})

	t.Run("SetInvocationName", func(t *testing.T) {
		t.Run("should store the Invocation name", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetInvocationName("inv_name"), "unable to set Invocation")
		})
		t.Run("should error if overwriting the Invocation name", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetInvocationName("Invocation"), "unable to set Invocation")
			// Same value should not error
			fxt.Assert(ctx.SetInvocationName("Invocation"), "unable to set Invocation")
			fxt.Assert(!ctx.SetInvocationName("new_invocation"), "should not have been able to overwrite Invocation")
		})
	})

	t.Run("SetInvocationID", func(t *testing.T) {
		t.Run("should store the Invocation ID", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetInvocationID("inv_id"), "unable to set Invocation")
		})
		t.Run("should error if overwriting the Invocation ID", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetInvocationID("Invocation"), "unable to set Invocation")
			// Same value should not error
			fxt.Assert(ctx.SetInvocationID("Invocation"), "unable to set Invocation")
			fxt.Assert(!ctx.SetInvocationID("new_invocation"), "should not have been able to overwrite Invocation")
		})
	})

	t.Run("InvocationName", func(t *testing.T) {
		t.Run("should return the Invocation name", func(t *testing.T) {
			ctx, fxt := setup(t)

			// Should start off empty.
			invocation := ctx.InvocationName()
			fxt.Assert(invocation == "", "Invocation should be empty. Got %s", invocation)
			fxt.Assert(ctx.SetInvocationName("inv_name"), "unable to set Invocation")
			invocation = ctx.InvocationName()
			fxt.Assert(invocation == "inv_name", "got unexpected value for Invocation name: %s", invocation)
		})
	})

	t.Run("InvocationID", func(t *testing.T) {
		t.Run("should return the Invocation ID", func(t *testing.T) {
			ctx, fxt := setup(t)

			// Should start off empty.
			invocation := ctx.InvocationID()
			fxt.Assert(invocation == "", "Invocation should be empty. Got %s", invocation)
			fxt.Assert(ctx.SetInvocationID("inv_id"), "unable to set Invocation")
			invocation = ctx.InvocationID()
			fxt.Assert(invocation == "inv_id", "got unexpected value for Invocation name: %s", invocation)
		})
	})

	t.Run("SetTarget", func(t *testing.T) {
		t.Run("should store the Target name", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(ctx.SetTarget("target_id", "target"), "unable to set target")
		})
		t.Run("should error if overwriting the Target name", func(t *testing.T) {
			ctx, fxt := setup(t)
			targetID := "target_id"
			fxt.Assert(ctx.SetTarget(targetID, "target"), "unable to set target")
			// Same value should not error
			fxt.Assert(ctx.SetTarget(targetID, "target"), "unable to set target")
			fxt.Assert(!ctx.SetTarget(targetID, "new_target"), "should not have been able to overwrite the Target")
		})
	})

	t.Run("Target", func(t *testing.T) {
		t.Run("should return the Target", func(t *testing.T) {
			ctx, fxt := setup(t)

			// Should start off empty.
			targetID := "target_id"
			name := ctx.Target(targetID)
			fxt.Assert(name == "", "Target should be empty. Got %s", name)
			fxt.Assert(ctx.SetTarget(targetID, "target_name"), "unable to set target")
			name = ctx.Target("target_id")
			fxt.Assert(name == "target_name", "got unexpected value for Target name: %s", name)
		})
	})

	t.Run("SetConfiguredTarget", func(t *testing.T) {
		t.Run("should store the ConfiguredTarget name", func(t *testing.T) {
			ctx, fxt := setup(t)
			fxt.Assert(
				ctx.SetConfiguredTarget("target_id", "config_id", "target"),
				"unable to set ConfiguredTarget")
		})
		t.Run("should error if overwriting the ConfiguredTarget name", func(t *testing.T) {
			ctx, fxt := setup(t)
			targetID := "target_id"
			configID := "config_id"
			fxt.Assert(ctx.SetConfiguredTarget(targetID, configID, "ct"),
				"unable to set ConfiguredTarget")
			// Same value should not error
			fxt.Assert(ctx.SetConfiguredTarget(targetID, configID, "ct"), "unable to set ConfiguredTarget")
			fxt.Assert(!ctx.SetConfiguredTarget(targetID, configID, "new_ct"), "should not have been able to overwrite the ConfiguredTarget")
		})
	})

	t.Run("ConfiguredTarget", func(t *testing.T) {
		t.Run("should return the ConfiguredTarget", func(t *testing.T) {
			ctx, fxt := setup(t)

			// Should start off empty.
			targetID := "target_id"
			configID := "config_id"
			name := ctx.ConfiguredTarget(targetID, configID)
			fxt.Assert(name == "", "ConfiguredTarget name should be empty. Got %s", name)
			fxt.Assert(ctx.SetConfiguredTarget(targetID, configID, "ct"), "unable to set ConfiguredTarget")
			name = ctx.ConfiguredTarget(targetID, configID)
			fxt.Assert(name == "ct", "got unexpected value for configured target name: %s", name)
		})
	})

	t.Run("should retain values after serialization", func(t *testing.T) {
		ctx, fxt := setup(t)

		// Fill the context.
		fxt.Assert(ctx.SetAuthToken("token"), "unable to set set AuthToken")
		fxt.Assert(ctx.SetInvocationName("inv_name"), "unable to set set Invocation Name")
		fxt.Assert(ctx.SetInvocationID("inv_id"), "unable to set Invocatino ID")
		fxt.Assert(ctx.SetTarget("target_id", "target"), "unable to set set Target")
		fxt.Assert(ctx.SetConfiguredTarget("target_id", "config_id", "config_target"), "unable to set set ConfiguredTarget")

		// Marshal and unmarshal it.
		bytes, err := json.Marshal(ctx)
		fxt.AssertNil(err)
		ctx = NewContext()
		fxt.AssertNil(json.Unmarshal(bytes, ctx))

		// Verify all the values are still there.

		invName := ctx.InvocationName()
		fxt.Assert(invName == "inv_name", "expected 'inv_name', got %s", invName)

		invID := ctx.InvocationID()
		fxt.Assert(invID == "inv_id", "expected 'inv_id', got %s", invID)

		token := ctx.AuthToken()
		fxt.Assert(token == "token", "expected 'token', got %s", token)

		target := ctx.Target("target_id")
		fxt.Assert(target == "target", "expected 'target', got %s", target)

		ct := ctx.ConfiguredTarget("target_id", "config_id")
		fxt.Assert(ct == "config_target", "expected 'config_target', got %s", ct)
	})
}
