package common

import (
	"fmt"
	"net/http"

	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/errors"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/form"
	"github.com/gavv/httpexpect"
)

func managerTest(e *httpexpect.Expect, sesID *http.Cookie) {

	fmt.Println()
	printlnWithColor("Manager", "blue")
	fmt.Println("============================")

	// show

	printlnWithColor("show", "green")
	e.GET(config.Url("/info/manager")).
		WithCookie(sesID.Name, sesID.Value).
		Expect().
		Status(200).
		Body().Contains("Managers").Contains("admin").Contains("1")

	// edit

	printlnWithColor("edit", "green")
	e.POST(config.Url("/edit/manager")).
		WithCookie(sesID.Name, sesID.Value).
		WithMultipart().
		WithForm(map[string]interface{}{
			"username":        "admin",
			"name":            "admin1",
			"password":        "admin",
			"password_again":  "admin",
			"role_id[]":       1,
			"permission_id[]": 1,
			form.PreviousKey:  config.Url("/info/manager?__page=1&__pageSize=10&__sort=id&__sort_type=desc"),
			"id":              "1",
			form.TokenKey:     "123",
		}).Expect().Status(200).Body().Contains(errors.EditFailWrongToken)

	// show form: without id

	//printlnWithColor("show form: without id", "green")
	//e.GET(config.Url("/info/manager/edit")).
	//	WithCookie(sesID.Name, sesID.Value).
	//	Expect().Status(200).Body().Contains(errors.WrongID)

	// show form

	printlnWithColor("show form", "green")
	formBody := e.GET(config.Url("/info/manager/edit")).
		WithQuery(constant.EditPKKey, "1").
		WithCookie(sesID.Name, sesID.Value).
		Expect().Status(200).Body()

	token := reg.FindStringSubmatch(formBody.Raw())

	// edit form

	printlnWithColor("edit form", "green")
	res := e.POST(config.Url("/edit/manager")).
		WithCookie(sesID.Name, sesID.Value).
		WithMultipart().
		WithForm(map[string]interface{}{
			"username":            "admin",
			"name":                "admin1",
			"password":            "admin",
			"password_again":      "admin",
			"avatar__delete_flag": "0",
			"role_id[]":           1,
			"permission_id[]":     1,
			form.PreviousKey:      config.Url("/info/manager?__page=1&__pageSize=10&__sort=id&__sort_type=desc"),
			"id":                  "1",
			form.TokenKey:         token[1],
		}).Expect().Status(200)
	res.Header("X-Pjax-Url").Contains(config.Url("/info/"))
	res.Body().Contains("admin1")

	// show new form

	printlnWithColor("show new form", "green")
	formBody = e.GET(config.Url("/info/manager/new")).
		WithCookie(sesID.Name, sesID.Value).
		Expect().Status(200).Body()

	token = reg.FindStringSubmatch(formBody.Raw())

	// new manager tester

	printlnWithColor("new manager test", "green")
	res = e.POST(config.Url("/new/manager")).
		WithCookie(sesID.Name, sesID.Value).
		WithMultipart().
		WithForm(map[string]interface{}{
			"username":            "tester",
			"name":                "tester",
			"password":            "tester",
			"password_again":      "tester",
			"avatar__delete_flag": "0",
			"role_id[]":           1,
			"permission_id[]":     1,
			form.PreviousKey:      config.Url("/info/manager?__page=1&__pageSize=10&__sort=id&__sort_type=desc"),
			"id":                  "1",
			form.TokenKey:         token[1],
		}).Expect().Status(200)
	res.Header("X-Pjax-Url").Contains(config.Url("/info/"))
	res.Body().Contains("tester")

	// tester login: wrong password

	printlnWithColor("tester login: wrong password", "green")
	e.POST(config.Url("/signin")).WithForm(map[string]string{
		"username": "tester",
		"password": "admin",
	}).Expect().Status(400)

	// tester login success

	printlnWithColor("tester login success", "green")
	e.POST(config.Url("/signin")).WithForm(map[string]string{
		"username": "tester",
		"password": "tester",
	}).Expect().Status(200).JSON().Equal(map[string]interface{}{
		"code": 200,
		"data": map[string]interface{}{
			"url": "/" + config.GetUrlPrefix(),
		},
		"msg": "ok",
	})
}