// Package api implements the REST API for the scrap exchange service.
package api

import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/gorilla/mux"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/mock"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/metrics2"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/scrap/go/scrap"
	"go.skia.org/infra/scrap/go/scrap/mocks"
)

// hash used by some tests.
const hash = "01234567890abcdef"

const scrapName = "@MyScrapName"

var errMyMockError = errors.New("my error returned from mock ScrapExchange")

// validScrapBody returns an io.Reader that contains a valid serialized
// scrap.ScrapBody.
func validScrapBody(t *testing.T) io.Reader {
	var b bytes.Buffer
	scrapBody := scrap.ScrapBody{
		Type: scrap.SVG,
		Body: "<svg></svg>",
	}
	err := json.NewEncoder(&b).Encode(scrapBody)
	require.NoError(t, err)
	return &b
}

// validScrapName returns an io.Reader that contains a valid serialized
// scrap.Name.
func validScrapName(t *testing.T) io.Reader {
	var b bytes.Buffer
	scrapName := scrap.Name{
		Hash: hash,
	}
	err := json.NewEncoder(&b).Encode(scrapName)
	require.NoError(t, err)
	return &b
}

// makeRequest makes the HTTP request to Api with the given scrapExchange.
func makeRequest(scrapExchange *mocks.ScrapExchange, w http.ResponseWriter, r *http.Request) {
	a := &Api{
		scrapExchange: scrapExchange,
	}

	// Make the request through a mux.Router so the URL paths get parsed and
	// routed correctly.
	router := mux.NewRouter()
	a.AddHandlers(router, AddProtectedEndpoints)

	router.ServeHTTP(w, r)
}

func testMethodAndPathReturnExpectedStatusCode(t *testing.T, method string, path string, expectedCode int) {
	a := New(nil)

	// Make the request through a mux.Router so the URL paths get parsed and
	// routed correctly.
	router := mux.NewRouter()
	a.AddHandlers(router, DoNotAddProtectedEndpoints)

	w := httptest.NewRecorder()
	r := httptest.NewRequest(method, path, nil)

	router.ServeHTTP(w, r)
	require.Equal(t, expectedCode, w.Code, "path: %s method: %s", path, method)
}

func TestAddHandlers_DoNotEnableProtectedEndpoints_ProtectedEndpointsReturn4xxStatusCodes(t *testing.T) {
	testMethodAndPathReturnExpectedStatusCode(t, "POST", "/_/scraps/", http.StatusNotFound)
	testMethodAndPathReturnExpectedStatusCode(t, "DELETE", fmt.Sprintf("/_/scraps/svg/%s", hash), http.StatusMethodNotAllowed)
	testMethodAndPathReturnExpectedStatusCode(t, "PUT", fmt.Sprintf("/_/names/svg/%s", scrapName), http.StatusMethodNotAllowed)
	testMethodAndPathReturnExpectedStatusCode(t, "DELETE", fmt.Sprintf("/_/names/svg/%s", scrapName), http.StatusMethodNotAllowed)
}

func TestWriteJSON_InvalidJSON_ReportsError(t *testing.T) {
	w := httptest.NewRecorder()
	notSerializable := struct {
		C complex128
	}{
		C: 12 + 3i,
	}
	writeJSON(w, notSerializable)
	require.Equal(t, http.StatusInternalServerError, w.Code)
	require.Equal(t, "Failed to encode JSON response.\n", w.Body.String())
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
}

func TestScrapCreateHandler_InvalidJSON_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	b := bytes.NewBufferString("]This is not valid json[")
	r := httptest.NewRequest("POST", "/_/scraps/", b)

	makeRequest(nil, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
}

func TestScrapCreateHandler_WriteSucceeds_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(scrapsCreateCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("POST", "/_/scraps/", validScrapBody(t))

	scrapExchange := &mocks.ScrapExchange{}
	scrapID := scrap.ScrapID{
		Hash: hash,
	}
	scrapExchange.On("CreateScrap", testutils.AnyContext, mock.AnythingOfType("scrap.ScrapBody")).Return(scrapID, nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, fmt.Sprintf("{\"Hash\":\"%s\"}\n", hash), w.Body.String())
	require.Equal(t, "application/json", w.Header().Get("Content-Type"))
	require.Equal(t, int64(1), callMetric.Get())
}

func TestScrapCreateHandler_WriteFails_ReturnsInternalServerError(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("POST", "/_/scraps/", validScrapBody(t))

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("CreateScrap", testutils.AnyContext, mock.AnythingOfType("scrap.ScrapBody")).Return(scrap.ScrapID{}, errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusInternalServerError, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
}

func TestScrapGetHandler_UnknownType_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/scraps/unknowntype/%s", hash), nil)

	makeRequest(nil, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Unknown type.\n", w.Body.String())
}

func TestScrapGetHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(scrapsGetCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/scraps/svg/%s", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapBody := scrap.ScrapBody{
		Type: scrap.SVG,
		Body: "<svg></svg>",
	}
	scrapExchange.On("LoadScrap", testutils.AnyContext, scrap.SVG, hash).Return(scrapBody, nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, "application/json", w.Header().Get("Content-Type"))
	require.Equal(t, int64(1), callMetric.Get())
}

func TestScrapGetHandler_LoadFails_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/scraps/svg/%s", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("LoadScrap", testutils.AnyContext, scrap.SVG, hash).Return(scrap.ScrapBody{}, errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to load scrap.\n", w.Body.String())
}

func TestScrapDeleteHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(scrapsDeleteCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("DELETE", fmt.Sprintf("/_/scraps/svg/%s", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("DeleteScrap", testutils.AnyContext, scrap.SVG, hash).Return(nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, int64(1), callMetric.Get())
}

func TestScrapDeleteHandler_DeleteFails_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("DELETE", fmt.Sprintf("/_/scraps/svg/%s", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("DeleteScrap", testutils.AnyContext, scrap.SVG, hash).Return(errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to delete scrap.\n", w.Body.String())
}

func TestRawGetHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(rawGetCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/raw/svg/%s", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapBody := scrap.ScrapBody{
		Type: scrap.SVG,
		Body: "<svg></svg>",
	}
	scrapExchange.On("LoadScrap", testutils.AnyContext, scrap.SVG, hash).Return(scrapBody, nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, scrapBody.Body, w.Body.String())
	require.Equal(t, "image/svg+xml", w.Header().Get("Content-Type"))
	require.Equal(t, int64(1), callMetric.Get())
}

func TestRawGetHandler_LoadFails_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/raw/svg/%s", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("LoadScrap", testutils.AnyContext, scrap.SVG, hash).Return(scrap.ScrapBody{}, errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to load scrap.\n", w.Body.String())
}

func TestTemplateGetHandler_LoadFails_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/tmpl/svg/%s/js", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("Expand", testutils.AnyContext, scrap.SVG, hash, scrap.JS, w).Return(errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to expand scrap.\n", w.Body.String())
}

func TestTemplateGetHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(templateGetCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/tmpl/svg/%s/js", hash), nil)

	const code = "// This is JS code!"
	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("Expand", testutils.AnyContext, scrap.SVG, hash, scrap.JS, w).Run(func(args mock.Arguments) {
		_, err := w.Write([]byte(code))
		assert.NoError(t, err)
	}).Return(nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, "text/plain", w.Header().Get("Content-Type"))
	require.Equal(t, code, w.Body.String())
	require.Equal(t, int64(1), callMetric.Get())
}

func TestTemplateGetHandler_InvalidLang_ReturnsBadRequest(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/tmpl/svg/%s/unknownlanguage", hash), nil)

	scrapExchange := &mocks.ScrapExchange{}

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusBadRequest, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Unknown language.\n", w.Body.String())
}

func TestNamePutHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(namesPutCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("PUT", fmt.Sprintf("/_/names/svg/%s", scrapName), validScrapName(t))

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("PutName", testutils.AnyContext, scrap.SVG, scrapName, mock.AnythingOfType("scrap.Name")).Return(nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, int64(1), callMetric.Get())
}

func TestNamePutHandler_PutFails_ReturnsInternalServerError(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("PUT", fmt.Sprintf("/_/names/svg/%s", scrapName), validScrapName(t))

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("PutName", testutils.AnyContext, scrap.SVG, scrapName, mock.AnythingOfType("scrap.Name")).Return(errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusInternalServerError, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to write name.\n", w.Body.String())
}

func TestNameGetHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(namesGetCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/names/svg/%s", scrapName), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapBody := scrap.Name{
		Hash:        hash,
		Description: "A description of the scrap.",
	}
	scrapExchange.On("GetName", testutils.AnyContext, scrap.SVG, scrapName).Return(scrapBody, nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, fmt.Sprintf("{\"Hash\":\"%s\",\"Description\":\"A description of the scrap.\"}\n", hash), w.Body.String())
	require.Equal(t, "application/json", w.Header().Get("Content-Type"))
	require.Equal(t, int64(1), callMetric.Get())
}

func TestNameGetHandler_GetFails_ReturnsInternalServerError(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", fmt.Sprintf("/_/names/svg/%s", scrapName), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("GetName", testutils.AnyContext, scrap.SVG, scrapName).Return(scrap.Name{}, errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusInternalServerError, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to retrieve Name.\n", w.Body.String())
}

func TestNameDeleteHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(namesDeleteCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("DELETE", fmt.Sprintf("/_/names/svg/%s", scrapName), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("DeleteName", testutils.AnyContext, scrap.SVG, scrapName).Return(nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, int64(1), callMetric.Get())
}

func TestNameDeleteHandler_DeleteNameFails_ReturnsInternalServerError(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("DELETE", fmt.Sprintf("/_/names/svg/%s", scrapName), nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("DeleteName", testutils.AnyContext, scrap.SVG, scrapName).Return(errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusInternalServerError, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to delete Name.\n", w.Body.String())
}

func TestNameListHandler_HappyPath_Success(t *testing.T) {
	callMetric := metrics2.GetCounter(namesListCallMetric)
	callMetric.Reset()
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", "/_/names/svg/", nil)

	scrapExchange := &mocks.ScrapExchange{}
	body := []string{
		scrapName,
		"AnotherScrap",
	}
	scrapExchange.On("ListNames", testutils.AnyContext, scrap.SVG).Return(body, nil)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusOK, w.Code)
	require.Equal(t, "application/json", w.Header().Get("Content-Type"))
	expected, err := json.Marshal(body)
	require.NoError(t, err)
	require.Equal(t, string(expected)+"\n", w.Body.String())
	require.Equal(t, int64(1), callMetric.Get())
}

func TestNameListHandler_ListFails_ReturnsInternalServerError(t *testing.T) {
	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", "/_/names/svg/", nil)

	scrapExchange := &mocks.ScrapExchange{}
	scrapExchange.On("ListNames", testutils.AnyContext, scrap.SVG).Return(nil, errMyMockError)

	makeRequest(scrapExchange, w, r)
	require.Equal(t, http.StatusInternalServerError, w.Code)
	require.Equal(t, "text/plain; charset=utf-8", w.Header().Get("Content-Type"))
	require.Equal(t, "Failed to load Names.\n", w.Body.String())
}
