package e2e

import (
	"encoding/json"
	"fmt"
	"strings"
)

func ExecCentralOrgCase() {
	Central_Registration()
	Central_ListOrganizations()
	Central_UpdateOrganization()
	Central_GetOrgByCompanyName()
	Central_GetExpWhiteList()
	Central_GetMspConfig()
}

func Central_Registration() {
	url := DevConsoleHost + "/api/v1/orgs"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header["Authorization"] = consoleAuthorization

	body := fmt.Sprintf(`{
		"email": "teste2e%s@pingcap.com",
		"first_name": "test",
		"last_name": "e2e",
		"password": "e2etetERT62dw",
		"accept_service": true
	}`, CurTimeStr())

	code, data, err := RestyExec("POST", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("Central_Org", "Registration", CaseDetail{
		Url:       url,
		Method:    "POST",
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 200,
		RspCode:   code,
		RspData:   data,
	})
}

func Central_ListOrganizations() {
	url := DevConsoleHost + "/api/v1/orgs"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header["Authorization"] = consoleAuthorization

	code, data, err := RestyExec("GET", url, header, "")
	if err != nil {
		code = 0
		data = err.Error()
	}
	pass := false
	if code == 200 {
		var list = &OrganizationList{}
		err := json.Unmarshal([]byte(data), list)
		if err == nil {
			for _, org := range list.Orgs {
				if org.Id == "1440002" && strings.ToLower(org.Status) == "active" {
					pass = true
					break
				}
			}
		}
	}

	SaveCase("Central_Org", "ListOrganizations", CaseDetail{
		Url:       url,
		Method:    "GET",
		ReqHeader: header,
		ReqBody:   "",
		Pass:      pass,
		RspCode:   code,
		RspData:   data,
	})

}

type OrganizationList struct {
	Orgs []*Organization `protobuf:"bytes,1,rep,name=orgs,proto3" json:"orgs,omitempty"`
}

type Organization struct {
	Id      string `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	Name    string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	Email   string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"`
	Country string `protobuf:"bytes,5,opt,name=country,proto3" json:"country,omitempty"`
	Status  string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"`
}

func Central_UpdateOrganization() {
	url := DevConsoleHost + "/api/v1/orgs/1440002"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header["Authorization"] = consoleAuthorization

	body := fmt.Sprintf(`{
		"name": "DevTestOrg-%s",
		"user_set_timezone": "-03:00"
	}`, CurDateStr())

	code, data, err := RestyExec("PUT", url, header, body)
	if err != nil {
		code = 0
		data = err.Error()
	}

	SaveCase("Central_Org", "UpdateOrganization", CaseDetail{
		Url:       url,
		Method:    "PUT",
		ReqHeader: header,
		ReqBody:   body,
		Pass:      code == 200,
		RspCode:   code,
		RspData:   data,
	})
}

func Central_GetOrgByCompanyName() {
	url := DevConsoleHost + "/api/v1/org/myorg"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header["Authorization"] = consoleAuthorization

	code, data, err := RestyExec("GET", url, header, "")
	if err != nil {
		code = 0
		data = err.Error()
	}
	pass := false
	if code == 200 {
		var rsp = &GetOrgByCompanyNameRsp{}
		err := json.Unmarshal([]byte(data), rsp)
		if err == nil && rsp.Org.Id == "1440002" && rsp.Org.Status == "ACTIVE" {
			pass = true
		}
	}

	SaveCase("Central_Org", "GetOrgByCompanyName", CaseDetail{
		Url:       url,
		Method:    "GET",
		ReqHeader: header,
		ReqBody:   "",
		Pass:      pass,
		RspCode:   code,
		RspData:   data,
	})
}

type GetOrgByCompanyNameRsp struct {
	Org *Organization `protobuf:"bytes,1,opt,name=org,proto3" json:"org,omitempty"`
}

func Central_GetExpWhiteList() {
	url := DevConsoleHost + "/api/v1/orgs/1440002/exp-whitelist"

	var header = map[string]string{}
	header["Content-type"] = "application/json"
	header["Authorization"] = consoleAuthorization

	code, data, err := RestyExec("GET", url, header, "")
	if err != nil {
		code = 0
		data = err.Error()
	}
	pass := false
	if code == 200 {
		var rsp = &GetExpWhiteListResp{}
		err := json.Unmarshal([]byte(data), rsp)
		if err == nil && len(rsp.ExpNames) > 0 {
			pass = true
		}
	}

	SaveCase("Central_Org", "GetExpWhiteList", CaseDetail{
		Url:       url,
		Method:    "GET",
		ReqHeader: header,
		ReqBody:   "",
		Pass:      pass,
		RspCode:   code,
		RspData:   data,
	})
}

type GetExpWhiteListResp struct {
	ExpNames []string `protobuf:"bytes,1,rep,name=exp_names,json=expNames,proto3" json:"exp_names,omitempty"`
}

func Central_GetMspConfig() {
	url := DevConsoleHost + "/api/v1/msp/msp-config?msp_name=wlt-test33"

	code, data, err := RestyExec("GET", url, nil, "")
	if err != nil {
		code = 0
		data = err.Error()
	}

	pass := false
	if code == 200 {
		//var rsp = &GetMspConfigResp{}
		//err := json.Unmarshal([]byte(data), rsp)
		//if err == nil && rsp.LogoUrl != "" && len(rsp.Advertisings) > 0 {
		//}
		pass = true

	}

	SaveCase("Central_Org", "GetMspConfig", CaseDetail{
		Url:       url,
		Method:    "GET",
		ReqHeader: nil,
		ReqBody:   "",
		Pass:      pass,
		RspCode:   code,
		RspData:   data,
	})
}

type GetMspConfigResp struct {
	LogoUrl      string         `protobuf:"bytes,1,opt,name=logo_url,json=logoUrl,proto3" json:"logo_url,omitempty"`
	Advertisings []*Advertising `protobuf:"bytes,2,rep,name=advertisings,proto3" json:"advertisings,omitempty"`
	Disclaimers  string         `protobuf:"bytes,3,opt,name=disclaimers,proto3" json:"disclaimers,omitempty"`
}

type Advertising struct {
	Index   *string `protobuf:"bytes,1,opt,name=index,proto3,oneof" json:"index,omitempty"`
	Heading string  `protobuf:"bytes,2,opt,name=heading,proto3" json:"heading,omitempty"`
	Body    string  `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"`
}

//func Central_GetMspCustomer() {
//	url := DevConsoleHost + "/api/v1/orgs/2130263/msp/msp-customer"
//
//	var header = map[string]string{}
//	header["Content-type"] = "application/json"
//	header["Authorization"] = consoleAuthorization
//
//	code, data, err := RestyExec("GET", url, header, "")
//	if err != nil {
//		code = 0
//		data = err.Error()
//	}
//
//	pass := false
//	if code == 200 {
//		var rsp = &GetMspCustomerResp{}
//		err := json.Unmarshal([]byte(data), rsp)
//		if err == nil && rsp.Name != "" {
//			pass = true
//		}
//
//	}
//
//	SaveCase("Central_Org", "GetMspCustomer", CaseDetail{
//		Url:       url,
//		Method:    "GET",
//		ReqHeader: header,
//		ReqBody:   "",
//		Pass:      pass,
//		RspCode:   code,
//		RspData:   data,
//	})
//}
//
//type GetMspCustomerResp struct {
//	Name       string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
//	LogoUrl    string `protobuf:"bytes,2,opt,name=logo_url,json=logoUrl,proto3" json:"logo_url,omitempty"`
//	Website    string `protobuf:"bytes,3,opt,name=website,proto3" json:"website,omitempty"`
//	EffectedAt string `protobuf:"bytes,4,opt,name=effected_at,json=effectedAt,proto3" json:"effected_at,omitempty"`
//}
//
