package restful

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"net/http/httptest"
	"reflect"
	"testing"
)

type keyvalue struct {
	readCalled  bool
	writeCalled bool
}

func (kv *keyvalue) Read(req *Request, v interface{}) error {
	//t := reflect.TypeOf(v)
	//rv := reflect.ValueOf(v)
	kv.readCalled = true
	return nil
}

func (kv *keyvalue) Write(resp *Response, status int, v interface{}) error {
	t := reflect.TypeOf(v)
	rv := reflect.ValueOf(v)
	for ix := 0; ix < t.NumField(); ix++ {
		sf := t.Field(ix)
		io.WriteString(resp, sf.Name)
		io.WriteString(resp, "=")
		io.WriteString(resp, fmt.Sprintf("%v\n", rv.Field(ix).Interface()))
	}
	kv.writeCalled = true
	return nil
}

// go test -v -test.run TestKeyValueEncoding ...restful
func TestKeyValueEncoding(t *testing.T) {
	type Book struct {
		Title         string
		Author        string
		PublishedYear int
	}
	kv := new(keyvalue)
	RegisterEntityAccessor("application/kv", kv)
	b := Book{"Singing for Dummies", "john doe", 2015}

	// Write
	httpWriter := httptest.NewRecorder()
	//								Accept									Produces
	resp := Response{ResponseWriter: httpWriter, requestAccept: "application/kv,*/*;q=0.8", routeProduces: []string{"application/kv"}, prettyPrint: true}
	resp.WriteEntity(b)
	t.Log(string(httpWriter.Body.Bytes()))
	if !kv.writeCalled {
		t.Error("Write never called")
	}

	// Read
	bodyReader := bytes.NewReader(httpWriter.Body.Bytes())
	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
	httpRequest.Header.Set("Content-Type", "application/kv; charset=UTF-8")
	request := NewRequest(httpRequest)
	var bb Book
	request.ReadEntity(&bb)
	if !kv.readCalled {
		t.Error("Read never called")
	}
}
