package api

import (
	"net/http"
	"testing"
)

var testMember = struct {
	Member
	Password string `json:"password"`
}{
	Member: Member{
		Num:     10,
		Name:    "foo",
		Email:   "foo@example.com",
		Role:    "",
		Balance: 10000,
	},
	Password: "password",
}

var testMemberAdmin = struct {
	Member
	Password string `json:"password"`
}{
	Member: Member{
		Num:     20,
		Name:    "bar",
		Email:   "bar@example.com",
		Role:    "admin",
		Balance: 5000,
	},
	Password: "password",
}

func TestMemberAddList(t *testing.T) {
	tapi := newTestAPI(t)
	defer tapi.close()

	tapi.addTestMember()
	var members []Member
	resp := tapi.doAdmin("GET", "/member", nil, &members)
	if resp.StatusCode != http.StatusOK {
		t.Fatal("Can't get members:", resp.Status)
	}

	if len(members) != 2 {
		t.Fatal("Wrong number of members", len(members), members)
	}
	if members[0].Name != "foo" {
		t.Error("Wrong name:", members[0].Name)
	}
	if members[0].Email != "foo@example.com" {
		t.Error("Wrong email:", members[0].Email)
	}
}

func TestMemberGetDelete(t *testing.T) {
	tapi := newTestAPI(t)
	defer tapi.close()

	resp := tapi.doAdmin("GET", "/member/10", nil, nil)
	if resp.StatusCode != http.StatusNotFound {
		t.Error("Expected not found:", resp.Status, resp.Body)
	}
	tapi.addTestMember()

	var gotMember Member
	resp = tapi.doAdmin("GET", "/member/10", nil, &gotMember)
	if resp.StatusCode != http.StatusOK {
		t.Error("Can't find the member:", resp.Status)
	}
	if gotMember.Num != 10 {
		t.Error("Wrong member:", gotMember.Num)
	}
	resp = tapi.doAdmin("DELETE", "/member/10", nil, nil)
	if resp.StatusCode != http.StatusOK {
		t.Error("Can't find the member:", resp.Status)
	}

	resp = tapi.doAdmin("GET", "/member/10", nil, nil)
	if resp.StatusCode != http.StatusNotFound {
		t.Error("Expected not found after delete:", resp.Status, resp.Body)
	}
}

func TestMemberUpdate(t *testing.T) {
	tapi := newTestAPI(t)
	defer tapi.close()

	tapi.addTestMember()
	member := testMember
	member.Balance = 1000
	resp := tapi.doAdmin("PUT", "/member/10", member, nil)
	if resp.StatusCode != http.StatusAccepted {
		t.Fatal("Can't update member:", resp.Status)
	}

	var gotMember Member
	resp = tapi.doAdmin("GET", "/member/10", nil, &gotMember)
	if resp.StatusCode != http.StatusOK {
		t.Error("Can't find the member:", resp.Status)
	}
	if gotMember.Balance != 1000 {
		t.Error("Wrong balance:", gotMember)
	}
}

func (tapi *testAPI) addTestMember() {
	resp := tapi.doAdmin("POST", "/member", testMember, nil)
	if resp.StatusCode != http.StatusCreated {
		tapi.t.Fatal("Can't create member:", resp.Status)
	}

	resp = tapi.doAdmin("POST", "/member", testMemberAdmin, nil)
	if resp.StatusCode != http.StatusCreated {
		tapi.t.Fatal("Can't create member:", resp.Status)
	}
}