package fstests

import (
	"fmt"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"testing"

	"github.com/474420502/requests"
)

func GetEtcYamlPathAuto() string {
	var currentFilePath string
	var ok bool
	for i := 1; i < 4; i++ {
		_, currentFilePath, _, ok = runtime.Caller(i)
		if !ok {
			panic("Error: Unable to get the current file path.")

		}
		dirs := strings.Split(currentFilePath, "/")
		if dirs[len(dirs)-2] != "fstests" {
			break
		}
	}

	curdir, err := filepath.Abs(currentFilePath)
	if err != nil {
		panic(err)

	}

	curdir = filepath.Dir(curdir)
	var limitCount = 10
	finfo, err := os.Stat(curdir + "/etc")
	for err != nil || !finfo.IsDir() {
		curdir = filepath.Dir(curdir)
		finfo, err = os.Stat(curdir + "/etc")
		limitCount--
		if limitCount <= 0 {
			panic("out limit")
		}
	}
	lidx := strings.LastIndex(curdir, "/")

	return fmt.Sprintf("%s/etc/%s.yaml", curdir, curdir[lidx+1:])

}

func GetCurrentServiceName() string {
	_, currentFilePath, _, ok := runtime.Caller(1)
	if !ok {
		panic("Error: Unable to get the current file path.")

	}

	curdir, err := filepath.Abs(currentFilePath)
	if err != nil {
		panic(err)

	}

	curdir = filepath.Dir(curdir)
	var limitCount = 10
	finfo, err := os.Stat(curdir + "/etc")
	for err != nil || !finfo.IsDir() {
		curdir = filepath.Dir(curdir)
		finfo, err = os.Stat(curdir + "/etc")
		limitCount--
		if limitCount <= 0 {
			panic("out limit")
		}
	}
	lidx := strings.LastIndex(curdir, "/")
	// log.Println(curdir[lidx+1:])
	return curdir[lidx+1:]
}

func GetSesssion() *requests.Session {
	ses := requests.NewSession()
	return ses
}

func GetSessionWithUserToken(t *testing.T, server requests.ITestServer, Host string, Port int) *requests.Session {
	ses := requests.NewSession()
	tp := ses.Post(fmt.Sprintf("http://%s:%d/api/auth/login", Host, Port))
	tp.SetBodyJson(map[string]interface{}{
		"email":    "9107058@qq.com",
		"password": "t1I0hOs0/AmhZfNk9ZiNnd3YZJpI+LL6COnHAmYEJk4=",
	})
	resp, err := tp.TestExecute(server)
	if err != nil {
		t.Error(err)
	}
	result := resp.Json()
	code := result.Get("code").Int()
	if code != 200 {
		t.Error("code is not 200")
	}

	token := result.Get("data.token")
	if !token.Exists() {
		t.Error("data.token is not exists")
	}
	ses.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.String()))

	return ses
}

func GetBackendSessionWithUserToken(t *testing.T, server requests.ITestServer, Host string, Port int) *requests.Session {
	ses := requests.NewSession()
	tp := ses.Post(fmt.Sprintf("http://%s:%d/api/backend-user/login", Host, Port))
	tp.SetBodyJson(map[string]interface{}{
		"email": "admin@admin.com",
		"pwd":   "ZnVzZW5fYmFja2VuZF8yMDIz47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU=",
	})
	resp, err := tp.TestExecute(server)
	if err != nil {
		t.Error(err)
	}
	result := resp.Json()
	code := result.Get("code").Int()
	if code != 200 {
		t.Error("code is not 200")
	}

	token := result.Get("data.token")
	if !token.Exists() {
		t.Error("data.token is not exists")
	}
	ses.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.String()))

	return ses
}

func GetSesssionWithGuestToken(t *testing.T, server requests.ITestServer, Host string, Port int) *requests.Session {
	ses := requests.NewSession()
	tp := ses.Post(fmt.Sprintf("http://%s:%d/api/auth/accept/cookie", Host, Port))

	resp, err := tp.TestExecute(server)
	if err != nil {
		t.Error(err)
	}
	result := resp.Json()
	token := result.Get("data.token")
	if !token.Exists() {
		t.Error("data.token is not exists")
	}
	ses.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.String()))

	return ses
}