package e2e

import (
	"encoding/csv"
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"
)

var (
	// biz -> (case -> ret)
	e2eCaseMap = map[string]map[string]CaseDetail{}
)

type CaseDetail struct {
	Url       string
	Method    string
	ReqHeader map[string]string
	ReqBody   string
	Pass      bool
	RspCode   int
	RspData   string
	Extra     map[string]interface{}
}

func SaveCase(biz, name string, detail CaseDetail) {
	m, ok := e2eCaseMap[biz]
	if !ok {
		m = map[string]CaseDetail{}
	}
	m[name] = detail
	e2eCaseMap[biz] = m
}

func CurDate() string {
	return time.Now().Format("20060102")
}

func GenCaseReport() {
	fileName := fmt.Sprintf("./test/e2e/main/e2e_case_report_%s.csv", CurDate())

	cf, err := os.Create(fileName)
	if err != nil {
		log.Printf("create csv file error: %v", err)
		return
	}
	writer := csv.NewWriter(cf)

	_ = writer.Write([]string{"BIZ", "CASE_NAME", "PASS", "HTTP_CODE", "HTTP_DETAIL"})

	var totalCnt, passCnt, failCnt = 0, 0, 0
	for biz, m := range e2eCaseMap {
		for name, detail := range m {
			pass := fmt.Sprintf("%v", detail.Pass)
			code := fmt.Sprintf("%d", detail.RspCode)
			bytes, _ := json.Marshal(&detail)
			_ = writer.Write([]string{biz, name, pass, code, string(bytes)})

			totalCnt += 1
			if detail.Pass {
				passCnt += 1
			} else {
				failCnt += 1
			}
		}
	}

	_ = writer.Write([]string{""})
	_ = writer.Write([]string{""})

	_ = writer.Write([]string{fmt.Sprintf("total=%d", totalCnt), fmt.Sprintf("pass=%d", passCnt), fmt.Sprintf("fail=%d", failCnt)})

	writer.Flush()
}
