package e2e

import (
	"encoding/json"
	"fmt"
)

func ExecCentralScimGroupCase() {
	Central_ListScimGroups()
	Central_UpdateScimGroupRole()

}

func Central_ListScimGroups() {
	url := DevConsoleHost + "/api/v1/orgs/1440002/scim-groups?page=1&per_page=3"
	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 = &ListScimGroupsRsp{}
		err := json.Unmarshal([]byte(data), rsp)
		if err == nil && len(rsp.Group) <= 3 {
			pass = true
		}
	}

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

}

type ListScimGroupsRsp struct {
	Total uint32       `json:"total,omitempty"`
	Group []*ScimGroup `json:"group,omitempty"`
}

type ScimGroup struct {
	Id           string                  `json:"id,omitempty"`
	OrgId        string                  `json:"org_id,omitempty"`
	GroupId      string                  `json:"group_id,omitempty"`
	OrgRole      string                  `json:"org_role,omitempty"`
	ProjectRoles []*ScimGroupProjectRole `json:"project_roles,omitempty"`
	Members      []*ScimGroupMember      `json:"members,omitempty"`
	GroupName    string                  `json:"group_name,omitempty"`
}

type ScimGroupProjectRole struct {
	ProjectRole string `json:"project_role,omitempty"`
	ProjectId   string `json:"project_id,omitempty"`
}

type ScimGroupMember struct {
	Value   string `json:"value,omitempty"`
	Display string ` json:"display,omitempty"`
}

func Central_UpdateScimGroupRole() {
	url := DevConsoleHost + "/api/v1/orgs/1440002/scim-groups?page=1&per_page=3"
	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()
	}
	var g *ScimGroup
	if code == 200 {
		var rsp = &ListScimGroupsRsp{}
		err := json.Unmarshal([]byte(data), rsp)
		if err == nil && len(rsp.Group) > 0 {
			g = rsp.Group[0]
		}
	}

	var updateUrl, updateBody, updateData string
	var updateCode int
	var secUrl, secData string
	var secCode int
	pass := false
	if g != nil {
		updateUrl = DevConsoleHost + fmt.Sprintf("/api/v1/orgs/1440002/scim-groups/%s/update-role", g.Id)
		updateBody = fmt.Sprintf(`{
			"group_id": "%s",
			"org_role": "org:member",
			"project_role": "project:dev",
			"project_ids": [3199935]
		}`, g.GroupId)
		updateCode, updateData, err = RestyExec("PATCH", updateUrl, header, updateBody)
		if err != nil {
			updateCode = 0
			updateData = err.Error()
		}
		if updateCode == 200 {
			secUrl = DevConsoleHost + "/api/v1/orgs/1440002/scim-groups"
			secCode, secData, err = RestyExec("GET", secUrl, header, "")
			if err != nil {
				secCode = 0
				secData = err.Error()
			}
			if secCode == 200 {
				var rsp = &ListScimGroupsRsp{}
				err := json.Unmarshal([]byte(secData), rsp)
				if err == nil && len(rsp.Group) > 0 {
					for _, lg := range rsp.Group {
						if lg.GroupId == g.GroupId && lg.OrgRole == "org:member" && len(lg.ProjectRoles) > 0 {
							for _, pr := range lg.ProjectRoles {
								if pr.ProjectId == "3199935" && pr.ProjectRole == "project:dev" {
									pass = true
								}
							}
						}
					}
				}
			}
		}
	}

	SaveCase("Central_ScimGroup", "UpdateScimGroupRole", CaseDetail{
		Url:       updateUrl,
		Method:    "PATCH",
		ReqHeader: header,
		ReqBody:   updateBody,
		Pass:      pass,
		RspCode:   updateCode,
		RspData:   updateData,
		Extra: map[string]interface{}{
			"list_url":         url,
			"list_code":        code,
			"list_data":        data,
			"second_list_url":  secUrl,
			"second_list_code": secCode,
			"second_list_data": secData,
		},
	})
}
