package api

import (
	"io/ioutil"
	"net/http/httptest"
	"path/filepath"
	"testing"

	"github.com/remogatto/prettytest"
	"gogs.carducci-dante.gov.it/karmen/core/config"
	"gogs.carducci-dante.gov.it/karmen/core/renderer"
)

var (
	server     *httptest.Server
	teacherUrl string
)

// Start of setup

type testSuite struct {
	prettytest.Suite
}

func exp(name string) string {
	path := filepath.Join("testdata/expectations", name+".html")
	exp, err := ioutil.ReadFile(path)
	if err != nil {
		panic(err)
	}
	return string(exp)
}

func TestRunner(t *testing.T) {
	prettytest.Run(
		t,
		new(testSuite),
	)
}

func (t *testSuite) BeforeAll() {
	err := config.Load("testdata/config.yaml", config.Config)
	if err != nil {
		panic(err)
	}
	config.Config.LogLevel = config.LOG_LEVEL_OFF

	rend := renderer.NewJSONRenderer()
	renderer.Use(rend)
}

// func (t *testSuite) TestGetToken() {
// 	tokenUrl := fmt.Sprintf("%s/get-token", server.URL)
// 	resp, err := http.Get(tokenUrl)
// 	defer resp.Body.Close()
// 	t.Nil(err)
// 	_, err = ioutil.ReadAll(resp.Body)
// 	t.Nil(err)
// 	t.Equal(http.StatusOK, resp.StatusCode)
// }

// func (t *testSuite) TestGetTeacher() {
// 	token, err := getToken()
// 	t.Nil(err)
// 	if !t.Failed() {
// 		teacher := orm.Teacher{}
// 		teacherUrl = fmt.Sprintf("%s/teachers/andrea.fazzi", server.URL)
// 		resp, err := sendAuthenticatedRequest("GET", teacherUrl, token)
// 		t.Nil(err)
// 		if !t.Failed() {
// 			defer resp.Body.Close()
// 			body, err := ioutil.ReadAll(resp.Body)
// 			t.Nil(err)
// 			t.Equal(http.StatusOK, resp.StatusCode)
// 			if !t.Failed() {
// 				err = json.Unmarshal(body, &teacher)
// 				t.Equal("Andrea", teacher.Name)
// 				t.Equal("FAZZI", teacher.Surname)
// 			}
// 		}
// 	}
// }

// func getToken() ([]byte, error) {
// 	resp, err := http.Get(fmt.Sprintf("%s/get-token", server.URL))
// 	defer resp.Body.Close()
// 	if err != nil {
// 		return nil, err
// 	}
// 	token, err := ioutil.ReadAll(resp.Body)
// 	if err != nil {
// 		return nil, err
// 	}
// 	return token, nil
// }

// func sendAuthenticatedRequest(method string, url string, token []byte) (*http.Response, error) {
// 	req, err := http.NewRequest(method, url, nil)
// 	if err != nil {
// 		return nil, err
// 	}
// 	req.Header.Set("Authorization", fmt.Sprintf("bearer %v", string(token)))
// 	resp, err := http.DefaultClient.Do(req)
// 	if err != nil {
// 		return nil, err
// 	}
// 	return resp, nil

// }
