package tripsgo

import (
	"bytes"
	"net/http"
	"net/http/httptest"
	"strconv"
	"testing"

	"github.com/gorilla/mux"
	"github.com/joho/godotenv"
	"github.com/stretchr/testify/assert"
)

// APITestCase needs to be exported to be accessed for test dir
type APITestCase struct {
	Tag              string
	Method           string
	URL              string
	Body             string
	Status           int
	ExpectedResponse string
	ActualResponse   string
}

func testAPI(router *mux.Router, method, URL, body string) *httptest.ResponseRecorder {
	req, _ := http.NewRequest(method, URL, bytes.NewBufferString(body))
	req.Header.Set("Content-Type", "application/json")
	res := httptest.NewRecorder()
	router.ServeHTTP(res, req)
	return res
}

// RunAPITests needs to be exported to be accessed for test dir
func RunAPITests(t *testing.T, router *mux.Router, tests []APITestCase) {
	for i := 0; i < len(tests); i++ {
		res := testAPI(router, tests[i].Method, tests[i].URL, tests[i].Body)
		tests[i].ActualResponse = res.Body.String()
		Debug.Println(tests[i].Tag + " - " + tests[i].ActualResponse)
		assert.Equal(t, tests[i].Status, res.Code, tests[i].Tag)
		Info.Println(tests[i].Tag + "- Response Code:" + strconv.Itoa(res.Code))
		if tests[i].ExpectedResponse != "" {
			assert.JSONEq(t, tests[i].ExpectedResponse, res.Body.String(), tests[i].Tag)
		}
	}
}

func RunAPITestsPlainText(t *testing.T, router *mux.Router, tests []APITestCase) {
	for i := 0; i < len(tests); i++ {
		res := testAPI(router, tests[i].Method, tests[i].URL, tests[i].Body)
		tests[i].ActualResponse = res.Body.String()
		Debug.Println(tests[i].Tag + " - " + tests[i].ActualResponse)
		assert.Equal(t, tests[i].Status, res.Code, tests[i].Tag)
		Info.Println(tests[i].Tag + "- Response Code:" + strconv.Itoa(res.Code))
		if tests[i].ExpectedResponse != "" {
			assert.Equal(t, tests[i].ExpectedResponse, res.Body.String(), tests[i].Tag)
		}
	}
}

func resetDataAccessEnvVars() {
	var fls bool = false
	debug = &fls
	godotenv.Overload()
	RebindDataAccessEnvironmentVariables()
}
