package server

import (
	"encoding/json"
	"io/ioutil"
	"net/http/httptest"
	"os"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils/unittest"
	"go.skia.org/infra/machine/go/machine"
	botmachine "go.skia.org/infra/sk8s/go/bot_config/machine"
)

func TestGetSettings_Success(t *testing.T) {
	unittest.SmallTest(t)

	r := httptest.NewRequest("GET", "/get_settings", nil)
	s, err := New(&botmachine.Machine{})
	require.NoError(t, err)
	w := httptest.NewRecorder()

	s.getSettings(w, r)

	res := w.Result()
	assert.Equal(t, 200, res.StatusCode)
	b, err := ioutil.ReadAll(res.Body)
	require.NoError(t, err)
	assert.Equal(t, `{"caches":{"isolated":{"size":8589934592}}}`, strings.TrimSpace(string(b)))
}

func TestGetState_Success(t *testing.T) {
	unittest.SmallTest(t)

	const someRackName = "some-rack-name"

	err := os.Setenv("MY_RACK_NAME", someRackName)
	require.NoError(t, err)

	r := httptest.NewRequest("POST", "/get_state", strings.NewReader("{\"foo\":\"bar\"}"))

	s, err := New(&botmachine.Machine{})
	require.NoError(t, err)
	w := httptest.NewRecorder()

	s.getState(w, r)

	res := w.Result()
	assert.Equal(t, 200, res.StatusCode)
	var dict map[string]interface{}
	err = json.NewDecoder(res.Body).Decode(&dict)
	require.NoError(t, err)
	assert.Equal(t, someRackName, dict["sk_rack"])
	assert.Equal(t, "bar", dict["foo"])
	_, ok := dict["maintenance"]
	assert.False(t, ok)
}

func TestGetState_MaintenanceAppearsInStateResponse(t *testing.T) {
	unittest.SmallTest(t)

	const someRackName = "some-rack-name"

	err := os.Setenv("MY_RACK_NAME", someRackName)
	require.NoError(t, err)

	r := httptest.NewRequest("POST", "/get_state", strings.NewReader("{\"foo\":\"bar\"}"))

	m := &botmachine.Machine{}
	m.SetMaintenanceMode(true)
	s, err := New(m)
	require.NoError(t, err)
	w := httptest.NewRecorder()

	s.getState(w, r)

	res := w.Result()
	assert.Equal(t, 200, res.StatusCode)
	var dict map[string]interface{}
	err = json.NewDecoder(res.Body).Decode(&dict)
	require.NoError(t, err)
	assert.True(t, dict["maintenance"].(bool))
}

func TestGetState_ErrOnInvalidJSON(t *testing.T) {
	unittest.SmallTest(t)

	r := httptest.NewRequest("POST", "/get_state", strings.NewReader("This is not valid JSON"))

	s, err := New(&botmachine.Machine{})
	require.NoError(t, err)
	w := httptest.NewRecorder()

	s.getState(w, r)

	res := w.Result()
	require.Equal(t, 500, res.StatusCode)
}

func TestGetDimensions_Success(t *testing.T) {
	unittest.SmallTest(t)

	r := httptest.NewRequest("POST", "/get_settings", strings.NewReader("{\"foo\": [\"bar\"]}"))

	s, err := New(&botmachine.Machine{})
	require.NoError(t, err)
	s.machine.SetDimensionsForSwarming(machine.SwarmingDimensions{"foo": {"baz", "quux"}})

	w := httptest.NewRecorder()

	s.getDimensions(w, r)

	res := w.Result()
	assert.Equal(t, 200, res.StatusCode)
	var dict map[string]interface{}
	err = json.NewDecoder(res.Body).Decode(&dict)
	require.NoError(t, err)
	// Expect the whole dimension to be replaced.
	expected := map[string]interface{}{
		"foo": []interface{}{"baz", "quux"},
	}
	assert.Equal(t, expected, dict)
}

func TestOnBeginTask_Success(t *testing.T) {
	unittest.SmallTest(t)

	r := httptest.NewRequest("GET", "/on_begin_task", nil)

	s, err := New(&botmachine.Machine{})
	require.NoError(t, err)
	require.False(t, s.machine.IsRunningSwarmingTask())
	s.onBeforeTaskSuccess.Reset()
	s.onAfterTaskSuccess.Reset()

	w := httptest.NewRecorder()

	s.onBeforeTask(w, r)

	res := w.Result()
	assert.Equal(t, 200, res.StatusCode)
	require.True(t, s.machine.IsRunningSwarmingTask())
	assert.Equal(t, int64(1), s.onBeforeTaskSuccess.Get())
	assert.Equal(t, int64(0), s.onAfterTaskSuccess.Get())
}

func TestOnAfterTask_Success(t *testing.T) {
	unittest.SmallTest(t)

	r := httptest.NewRequest("GET", "/on_after_task", nil)

	s, err := New(&botmachine.Machine{})
	require.NoError(t, err)
	s.machine.SetIsRunningSwarmingTask(true)
	require.True(t, s.machine.IsRunningSwarmingTask())
	s.onBeforeTaskSuccess.Reset()
	s.onAfterTaskSuccess.Reset()

	w := httptest.NewRecorder()

	s.onAfterTask(w, r)

	res := w.Result()
	assert.Equal(t, 200, res.StatusCode)
	require.False(t, s.machine.IsRunningSwarmingTask())
	assert.Equal(t, int64(0), s.onBeforeTaskSuccess.Get())
	assert.Equal(t, int64(1), s.onAfterTaskSuccess.Get())
}
