package feishu

import (
	"AutoSSO/Pbs"
	"errors"
	"fmt"
	"github.com/axgle/mahonia"
	"io/ioutil"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"
)

/*
该模块为飞书消息通知模块函数
申请权限，添加权限完成后通知到申请人员
到期后权限回收，在回收之前会提醒，回收之后会告知
*/

var (
	//消息模板，替换 user_open_id 、send_message、notice_title(用户的openid 消息内容 消息标题)
	Template_Notice = `
{
    "receive_id": "user_open_id",
    "content": "{\"config\":{\"wide_screen_mode\":true},\"elements\":[{\"tag\":\"div\",\"text\":{\"content\":\"send_message\",\"tag\":\"lark_md\"}}],\"header\":{\"template\":\"turquoise\",\"title\":{\"content\":\"notice_title\",\"tag\":\"plain_text\"}}}",
    "msg_type": "interactive"
}
`

	//sso 过期清理前提示
	AWS_Expired_notice = `您好！
您的 AWS SSO Permission  permission_name 授权已经过期，系统将在 3 天后自动回收此权限。
如果您需要继续使用该权限，请在权限回收后重新申请，若有任何疑问，请联系 PingCAP 安全团队。
`

	GCP_Expired_notice = `您好！
您的 GCP SSO Permission  permission_name 授权已经过期，系统将在 3 天后自动回收此权限。
如果您需要继续使用该权限，请在权限回收后重新申请，若有任何疑问，请联系 PingCAP 安全团队。
`

	//sso 过期清理后提示
	AWS_Deled_Permission_notice = `您好！
您的 AWS SSO Permission permission_name 因授权过期已经被系统自动回收
如果需要继续使用相关权限，请走飞书流程重新申请
若有任何疑问，请联系 PingCAP 安全团队
`
	//gcp 过期清理提示
	GCP_Deled_Permission_notice = `您好！
您的 GCP SSO Permission permission_name 因授权过期已经被系统自动回收
如果需要继续使用相关权限，请走飞书流程重新申请
若有任何疑问，请联系 PingCAP 安全团队
`

	//该提醒是权限添加成功后，发送给申请权限的人员
	AWS_Add_Permission_notice = `您好！
您申请的 AWS SSO Permission permission_name 已经授予完成，请检查。
若有任何疑问，请联系 PingCAP 安全团队
`
	//该提醒是权限添加成功后，发送给申请权限的人员
	GCP_Add_Permission_notice = `您好！
您申请的 GCP SSO Permission permission_name 已经授予完成，请检查。
若有任何疑问，请联系 PingCAP 安全团队
`

	//AWS SSO-自动化管控服务权限通知，预设每周 4 通知
	AWS_SSO_Service_Notice = `
截至 now_time ，AWS IAM SSO 授权服务添加和回收权限数据汇总

一、自动授予 IAM SSO 权限数据
添加授予权限总数:total_add_per_num
• DBaaS-Prod-ViewOnly-Role:DBaaS-Prod-ViewOnly-Role_anum
• DBaaS-Prod-OnCall-Role:DBaaS-Prod-OnCall-Role_anum
• DBaaS-Prod-Billing-Role:DBaaS-Prod-Billing-Role_anum
• DBaaS-Prod-Admin-Role:DBaaS-Prod-Admin-Role_anum
• PingCAP-SecurityAdmin-Role:PingCAP-SecurityAdmin-Role_anum
• DBaaS-Prod-EC2-Role:DBaaS-Prod-EC2-Role_anum
• DBaaS-DevUser-Role:DBaaS-DevUser-Role_anum
• DBaaS-Prod-Web-Role:DBaaS-Prod-Web-Role_anum
• DBaaS-Prod-OrgOperator-Role:DBaaS-Prod-OrgOperator-Role_anum
• Prod-Tiflow-Engine-RDS:Prod-Tiflow-Engine-RDS_anum
• DBaaS-DevLeader-Role:DBaaS-DevLeader-Role_anum
• DBaaS-Infra-DevUser-Role:DBaaS-Infra-DevUser-Role_anum
• DbaaS-Prod-GlueFullAccess:DbaaS-Prod-GlueFullAccess_anum
• DBaaS-Prod-OnCall-BastionEC2-Role:DBaaS-Prod-OnCall-BastionEC2-Role_anum
• DBaaS-Prod-Support-Role:DBaaS-Prod-Support-Role_anum

二、自动回收过期 IAM SSO 权限
回收过期权限总数:total_del_per_num
1、通用全集回收
• DBaaS-Prod-ViewOnly-Role:DBaaS-Prod-ViewOnly-Role_dnum
• DBaaS-Prod-OnCall-Role:DBaaS-Prod-OnCall-Role_dnum
• DBaaS-Prod-Billing-Role:DBaaS-Prod-Billing-Role_dnum
• DBaaS-Prod-Admin-Role:DBaaS-Prod-Admin-Role_dnum
• PingCAP-SecurityAdmin-Role:PingCAP-SecurityAdmin-Role_dnum
• DBaaS-Prod-EC2-Role:DBaaS-Prod-EC2-Role_dnum
• DBaaS-DevUser-Role:DBaaS-DevUser-Role_dnum
• DBaaS-Prod-Web-Role:DBaaS-Prod-Web-Role_dnum
• DBaaS-Prod-OrgOperator-Role:DBaaS-Prod-OrgOperator-Role_dnum
• Prod-Tiflow-Engine-RDS:Prod-Tiflow-Engine-RDS_dnum
• DBaaS-DevLeader-Role:DBaaS-DevLeader-Role_dnum
• DBaaS-Infra-DevUser-Role:DBaaS-Infra-DevUser-Role_dnum
• DbaaS-Prod-GlueFullAccess:DbaaS-Prod-GlueFullAccess_dnum
• DBaaS-Prod-OnCall-BastionEC2-Role:DBaaS-Prod-OnCall-BastionEC2-Role_dnum
• DBaaS-Prod-Support-Role:DBaaS-Prod-Support-Role_dnum
2、非通用权限集回收数：N_general_num
`

	//AWS SSO-自动化管控服务权限通知
	GCP_SSO_Service_Notice = `
截至 now_time ，GCP IAM SSO 授权服务添加和回收权限数据汇总

一、自动授予 IAM SSO 权限数据
添加授予权限总数:total_add_per_num
• DBaaS-Prod-ViewOnly-Role:DBaaS-Prod-ViewOnly-Role_anum
• DBaaS-Prod-DevUser-Role:DBaaS-Prod-DevUser-Role_anum
• DBaaS-Prod-DevSpecial-Role:DBaaS-Prod-DevSpecial-Role_anum
• DBaaS-Prod-DevAdmin-Role:DBaaS-Prod-DevAdmin-Role_anum
• DBaaS-Prod-Bigquery-Role:DBaaS-Prod-Bigquery-Role_anum
• DBaaS-Prod-Billing-Admin-Role:DBaaS-Prod-Billing-Admin-Role_anum
• DBaaS-Prod-Billing-ViewOnly-Role:DBaaS-Prod-Billing-ViewOnly-Role_anum
• DBaaS-Prod-Admin-Role:DBaaS-Prod-Admin-Role_anum
• DBaaS-Prod-Security-Role:DBaaS-Prod-Security-Role_anum

二、自动回收过期 IAM SSO 权限
回收过期权限总数:total_del_per_num
• DBaaS-Prod-ViewOnly-Role:DBaaS-Prod-ViewOnly-Role_dnum
• DBaaS-Prod-DevUser-Role:DBaaS-Prod-DevUser-Role_dnum
• DBaaS-Prod-DevSpecial-Role:DBaaS-Prod-DevSpecial-Role_dnum
• DBaaS-Prod-DevAdmin-Role:DBaaS-Prod-DevAdmin-Role_dnum
• DBaaS-Prod-Bigquery-Role:DBaaS-Prod-Bigquery-Role_dnum
• DBaaS-Prod-Billing-Admin-Role:DBaaS-Prod-Billing-Admin-Role_dnum
• DBaaS-Prod-Billing-ViewOnly-Role:DBaaS-Prod-Billing-ViewOnly-Role_dnum
• DBaaS-Prod-Admin-Role:DBaaS-Prod-Admin-Role_dnum
• DBaaS-Prod-Security-Role:DBaaS-Prod-Security-Role_dnum
`
)

/*
通过该函数来调用各个子函数发送飞书消息
*/
func Send_SSO_Service_Notice() {
	fmt.Println("start monitoring feishu notice service")
	for {
		//获取 config/notice_set.txt 中飞书群 chat_id 和设置的时间
		chat_id, timedatas := Get_wday_Hint_Mint()

		//判断时间
		if Is_wint_hint_mint(timedatas) == true {
			//获取已经添加的权限集数据
			aws_add_pers_data, gcp_add_pers_data := AWS_GCP_Read_add_per_log_Notice(AWS_SSO_Service_Notice, GCP_SSO_Service_Notice)

			//获取已经回收的权限集数据
			aws_pers_data, gcp_pers_data := AWS_GCP_Read_del_per_log_Notice(aws_add_pers_data, gcp_add_pers_data)
			//oc_948d6d39be192f1b75ef2e218f2b0707   安全群
			//oc_b9b19cec391f2c216dc9c5ded5c1ca40   测试群

			currentTime := time.Now()
			formattedTime := currentTime.Format("2006-01-02 15:04")
			//AWS 发送飞书消息
			aws_pers_data = strings.ReplaceAll(aws_pers_data, "now_time", formattedTime)
			Send_Group_Notice(chat_id, "AWS IAM SSO Service Notice", aws_pers_data)

			//GCP 发送飞书消息
			currentTime = time.Now()
			gcp_pers_data = strings.ReplaceAll(gcp_pers_data, "now_time", formattedTime)
			Send_Group_Notice(chat_id, "GCP IAM SSO Service Notice", gcp_pers_data)

			//暂停 61 秒
			timer := time.NewTimer(time.Duration(61) * time.Second)
			// wait
			<-timer.C
		}

		//do it every 20 second
		timer := time.NewTimer(time.Duration(20) * time.Second)
		// wait
		<-timer.C
	}

}

/*
发送飞书群消息函数
receive_id 为飞书群 ID，在发送消息的选择群组中可获取
*/
func Send_Group_Notice(receive_id string, title string, sendmessage string) error {
	receive_id = strings.TrimSpace(receive_id)
	title = strings.TrimSpace(title)
	sendmessage = strings.TrimSpace(sendmessage)
	//获取 header token
	APP_Token, aterr := Get_Tenant_AccessToken()
	if aterr != nil {
		return aterr
	}

	//send message to user
	APP_Token, aterr = Get_Tenant_AccessToken()
	if aterr != nil {
		return aterr
	}
	send_msg_url := "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id"
	send_message_data := strings.ReplaceAll(Template_Notice, "user_open_id", receive_id) //user open id
	sendmessage = strings.ReplaceAll(sendmessage, "\n", `\\n`)
	send_message_data = strings.ReplaceAll(send_message_data, "send_message", sendmessage)
	send_message_data = strings.ReplaceAll(send_message_data, "notice_title", title)

	_, serr := HTTP_POST(send_msg_url, APP_Token, send_message_data)
	if serr != nil {
		return serr
	}

	return nil
}

/*
email 为需要发送的  user 的邮箱
title 为需要发送的标题
sendmessgae 为发送的内容
*/
func Send_User_Notice(email string, title string, sendmessage string) error {
	//获取 header token
	APP_Token, aterr := Get_Tenant_AccessToken()
	if aterr != nil {
		return aterr
	}

	//获取 user 的 open_id
	router_url := "https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=open_id"
	msg_openid := `{"emails": ["` + strings.TrimSpace(email) + `"]}`
	openidstr, err := HTTP_POST(router_url, APP_Token, msg_openid)
	if err != nil {
		return err
	}
	openids, err := RegxStr(openidstr, `"user_id":"[\w]+"`)
	if err != nil {
		return nil
	}
	open_id := strings.ReplaceAll(openids, `"user_id":"`, "")
	open_id = strings.ReplaceAll(open_id, `"`, "")
	if open_id == "" {
		return errors.New("open_id is null")
	}

	//send message to user
	APP_Token, aterr = Get_Tenant_AccessToken()
	if aterr != nil {
		return aterr
	}
	send_msg_url := "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id"
	send_message_data := strings.ReplaceAll(Template_Notice, "user_open_id", open_id) //user open id
	sendmessage = strings.ReplaceAll(sendmessage, "\n", `\\n`)
	send_message_data = strings.ReplaceAll(send_message_data, "send_message", sendmessage)
	send_message_data = strings.ReplaceAll(send_message_data, "notice_title", title)

	_, serr := HTTP_POST(send_msg_url, APP_Token, send_message_data)
	if serr != nil {
		return serr
	}

	return nil
}

/*
Hurl 方位的路由
ha  自定义 header 鉴权头，如 t-g1047ac17R4FKJ2IICQQNBN6IU2QTTPBEHQHODHL
postdata 发送的数据包
*/
func HTTP_POST(Hurl string, ha string, postdata string) (string, error) {
	req, err := http.NewRequest("POST", Hurl, strings.NewReader(postdata))
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0")
	req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
	req.Header.Set("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")
	//req.Header.Set("Accept-Encoding","gzip, deflate")
	req.Header.Set("Upgrade-Insecure-Requests", "1")
	req.Header.Set("Sec-Fetch-Dest", "document")
	req.Header.Set("Sec-Fetch-Mode", "navigate")
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+ha)
	//req.Header.Set("Content-Type","application/x-www-form-urlencoded")
	//req.Header.Set("Cookie","lianan")
	client := &http.Client{
		Timeout: time.Millisecond * 10000,
	}
	resp2, err := client.Do(req)
	if err != nil {
		return "", err
	}
	body, err := ioutil.ReadAll(resp2.Body)
	if err != nil {
		return "", err
	}
	resp2.Body.Close()
	Retexecstr := mahonia.NewDecoder("gbk").ConvertString(string(body))
	return Retexecstr, nil
}

// 判断 ./log/add_permission_log 中行字符是 AWS 还是 GCP, 若是 AWS 则返回大写的 AWS，若是 GCP 则返回大写的 GCP, 若返回 ERR 则是错误的日志
func IS_AWS_GCP_add_permission_log(logstr string) string {
	var retstr string
	logstr = strings.TrimSpace(logstr)
	if logstr != "" {
		logstr_spi := strings.Split(logstr, " ")
		if len(logstr_spi) >= 5 {
			accountstr := logstr_spi[2]
			pdstr := isAllDigits(accountstr)
			if pdstr == true {
				retstr = "AWS"
			} else {
				retstr = "GCP"
			}
		} else {
			retstr = "ERR"
		}
	} else {
		retstr = "ERR"
	}
	return retstr
}

// 判断 ./log/del_permission_log 中行字符是 AWS 还是 GCP，若是 AWS 则返回大写的 AWS，若是 GCP 则返回大写的 GCP, 若返回 ERR 则是错误的日志
func IS_AWS_GCP_del_permission_log(logstr string) string {
	var retstr string
	logstr = strings.TrimSpace(logstr)
	if strings.Contains(logstr, "remove permission success") == true {
		logstr_spi := strings.Split(logstr, " ")
		if len(logstr_spi) >= 5 {
			accountstr := logstr_spi[2]
			pdstr := isAllDigits(accountstr)
			if pdstr == true {
				retstr = "AWS"
			} else {
				retstr = "GCP"
			}
		} else {
			retstr = "ERR"
		}
	}
	return retstr
}

// 读取 log 目录下 add_permission_log,返回 SSO_Service_Notice 模板中添加权限部分的数据
func AWS_GCP_Read_add_per_log_Notice(aws_tmple_notice string, gcp_tmple_notice string) (string, string) {
	add_log_file_path := "./log/add_permission_log"
	add_log_strs := Pbs.Read_txt_File(add_log_file_path)

	// AWS 权限集数量相关变量
	var DBaaS_Prod_ViewOnly_Role_anum int = 0
	var DBaaS_Prod_OnCall_Role_anum int = 0
	var DBaaS_Prod_Billing_Role_anum int = 0
	var DBaaS_Prod_Admin_Role_anum int = 0
	var PingCAP_SecurityAdmin_Role_anum int = 0
	var DBaaS_Prod_EC2_Role_anum int = 0
	var DBaaS_DevUser_Role_anum int = 0
	var DBaaS_Prod_Web_Role_anum int = 0
	var DBaaS_Prod_OrgOperator_Role_anum int = 0
	var Prod_Tiflow_Engine_RDS_anum int = 0
	var DBaaS_DevLeader_Role_anum int = 0
	var DBaaS_Infra_DevUser_Role_anum int = 0
	var DbaaS_Prod_GlueFullAccess_anum int = 0
	var DBaaS_Prod_OnCall_BastionEC2_Role_anum int = 0
	var DBaaS_Prod_Support_Role_anum int = 0
	var add_total_num int = 0

	// GCP 权限数量相关变量
	var GCP_DBaaS_Prod_ViewOnly_Role_anum int = 0
	var GCP_DBaaS_Prod_DevUser_Role_anum int = 0
	var GCP_DBaaS_Prod_DevSpecial_Role_anum int = 0
	var GCP_DBaaS_Prod_DevAdmin_Role_anum int = 0
	var GCP_DBaaS_Prod_Bigquery_Role_anum int = 0
	var GCP_DBaaS_Prod_Billing_Admin_Role_anum int = 0
	var GCP_DBaaS_Prod_Billing_ViewOnly_Role_anum int = 0
	var GCP_DBaaS_Prod_Admin_Role_anum int = 0
	var GCP_DBaaS_Prod_Security_Role_anum int = 0
	var GCP_add_total_num = 0

	for _, perstr := range add_log_strs {
		perstr = strings.TrimSpace(perstr)
		if perstr != "" {
			cloud_type := IS_AWS_GCP_add_permission_log(perstr)
			switch cloud_type {
			case "AWS":
				add_total_num += 1
				perstr = strings.ToLower(perstr)
				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-ViewOnly-Role")) == true {
					DBaaS_Prod_ViewOnly_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-OnCall-Role")) == true {
					DBaaS_Prod_OnCall_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Billing-Role")) == true {
					DBaaS_Prod_Billing_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Admin-Role")) == true {
					DBaaS_Prod_Admin_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("PingCAP-SecurityAdmin-Role")) == true {
					PingCAP_SecurityAdmin_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-EC2-Role")) == true {
					DBaaS_Prod_EC2_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-DevUser-Role")) == true {
					DBaaS_DevUser_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Web-Role")) == true {
					DBaaS_Prod_Web_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-OrgOperator-Role")) == true {
					DBaaS_Prod_OrgOperator_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("Prod-Tiflow-Engine-RDS")) == true {
					Prod_Tiflow_Engine_RDS_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-DevLeader-Role")) == true {
					DBaaS_DevLeader_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Infra-DevUser-Role")) == true {
					DBaaS_Infra_DevUser_Role_anum += 1
					continue
				}
				if strings.Contains(perstr, strings.ToLower("DbaaS-Prod-GlueFullAccess")) == true {
					DbaaS_Prod_GlueFullAccess_anum += 1
					continue
				}
				if strings.Contains(perstr, strings.ToLower("BaaS-Prod-OnCall-BastionEC2-Role")) == true {
					DBaaS_Prod_OnCall_BastionEC2_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Support-Role")) == true {
					DBaaS_Prod_Support_Role_anum += 1
					continue
				}
				break
			case "GCP":
				GCP_add_total_num += 1
				perstr = strings.ToLower(perstr)
				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-ViewOnly-Role")) == true {
					GCP_DBaaS_Prod_ViewOnly_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-DevUser-Role")) == true {
					GCP_DBaaS_Prod_DevUser_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-DevSpecial-Role")) == true {
					GCP_DBaaS_Prod_DevSpecial_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-DevAdmin-Role")) == true {
					GCP_DBaaS_Prod_DevAdmin_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Bigquery-Role")) == true {
					GCP_DBaaS_Prod_Bigquery_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Billing-Admin-Role")) == true {
					GCP_DBaaS_Prod_Billing_Admin_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Billing-ViewOnly-Role")) == true {
					GCP_DBaaS_Prod_Billing_ViewOnly_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Admin-Role")) == true {
					GCP_DBaaS_Prod_Admin_Role_anum += 1
					continue
				}

				if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Security-Role")) == true {
					GCP_DBaaS_Prod_Security_Role_anum += 1
					continue
				}
				break
			}
		}
	}

	//AWS 相关的通知模板
	aws_retstr := aws_tmple_notice
	aws_retstr = strings.ReplaceAll(aws_retstr, "total_add_per_num", strconv.Itoa(int(add_total_num)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-ViewOnly-Role_anum", strconv.Itoa(int(DBaaS_Prod_ViewOnly_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-OnCall-Role_anum", strconv.Itoa(int(DBaaS_Prod_OnCall_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Billing-Role_anum", strconv.Itoa(int(DBaaS_Prod_Billing_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Admin-Role_anum", strconv.Itoa(int(DBaaS_Prod_Admin_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "PingCAP-SecurityAdmin-Role_anum", strconv.Itoa(int(PingCAP_SecurityAdmin_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-EC2-Role_anum", strconv.Itoa(int(DBaaS_Prod_EC2_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-DevUser-Role_anum", strconv.Itoa(int(DBaaS_DevUser_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Web-Role_anum", strconv.Itoa(int(DBaaS_Prod_Web_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-OrgOperator-Role_anum", strconv.Itoa(int(DBaaS_Prod_OrgOperator_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "Prod-Tiflow-Engine-RDS_anum", strconv.Itoa(int(Prod_Tiflow_Engine_RDS_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-DevLeader-Role_anum", strconv.Itoa(int(DBaaS_DevLeader_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Infra-DevUser-Role_anum", strconv.Itoa(int(DBaaS_Infra_DevUser_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DbaaS-Prod-GlueFullAccess_anum", strconv.Itoa(int(DbaaS_Prod_GlueFullAccess_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-OnCall-BastionEC2-Role_anum", strconv.Itoa(int(DBaaS_Prod_OnCall_BastionEC2_Role_anum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Support-Role_anum", strconv.Itoa(int(DBaaS_Prod_Support_Role_anum)))

	// GCP 相关的通知模板
	gcp_retstr := gcp_tmple_notice
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "total_add_per_num", strconv.Itoa(int(GCP_add_total_num)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-ViewOnly-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_ViewOnly_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-DevUser-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_DevUser_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-DevSpecial-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_DevSpecial_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-DevAdmin-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_DevAdmin_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Bigquery-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_Bigquery_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Billing-Admin-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_Billing_Admin_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Billing-ViewOnly-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_Billing_ViewOnly_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Admin-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_Admin_Role_anum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Security-Role_anum", strconv.Itoa(int(GCP_DBaaS_Prod_Security_Role_anum)))
	return aws_retstr, gcp_retstr
}

// 读取 log 目录下 del_permission_log,返回 SSO_Service_Notice 模板中添加权限部分的数据
func AWS_GCP_Read_del_per_log_Notice(aws_tmple_notice string, gcp_tmple_notice string) (string, string) {
	del_log_file_path := "./log/del_permission_log"
	del_log_strs := Pbs.Read_txt_File(del_log_file_path)

	// AWS 权限数量相关变量
	var DBaaS_Prod_ViewOnly_Role_dnum int = 0
	var DBaaS_Prod_OnCall_Role_dnum int = 0
	var DBaaS_Prod_Billing_Role_dnum int = 0
	var DBaaS_Prod_Admin_Role_dnum int = 0
	var PingCAP_SecurityAdmin_Role_dnum int = 0
	var DBaaS_Prod_EC2_Role_dnum int = 0
	var DBaaS_DevUser_Role_dnum int = 0
	var DBaaS_Prod_Web_Role_dnum int = 0
	var DBaaS_Prod_OrgOperator_Role_dnum int = 0
	var Prod_Tiflow_Engine_RDS_dnum int = 0
	var DBaaS_DevLeader_Role_dnum int = 0
	var DBaaS_Infra_DevUser_Role_dnum int = 0
	var DbaaS_Prod_GlueFullAccess_dnum int = 0
	var DBaaS_Prod_OnCall_BastionEC2_Role_dnum int = 0
	var DBaaS_Prod_Support_Role_dnum int = 0
	var del_total_num int = 0

	//GCP 权限数量相关变量
	var GCP_DBaaS_Prod_ViewOnly_Role_dnum int = 0
	var GCP_DBaaS_Prod_DevUser_Role_dnum int = 0
	var GCP_DBaaS_Prod_DevSpecial_Role_dnum int = 0
	var GCP_DBaaS_Prod_DevAdmin_Role_dnum int = 0
	var GCP_DBaaS_Prod_Bigquery_Role_dnum int = 0
	var GCP_DBaaS_Prod_Billing_Admin_Role_dnum int = 0
	var GCP_DBaaS_Prod_Billing_ViewOnly_Role_dnum int = 0
	var GCP_DBaaS_Prod_Admin_Role_dnum int = 0
	var GCP_DBaaS_Prod_Security_Role_dnum int = 0
	var GCP_del_total_num = 0

	for _, perstr := range del_log_strs {
		perstr = strings.TrimSpace(perstr)
		if perstr != "" {
			cloud_type := IS_AWS_GCP_del_permission_log(perstr)
			switch cloud_type {
			case "AWS":
				if strings.Contains(perstr, "remove permission success") == true {
					del_total_num += 1
					perstr = strings.ToLower(perstr)
					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-ViewOnly-Role")) == true {
						DBaaS_Prod_ViewOnly_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-OnCall-Role")) == true {
						DBaaS_Prod_OnCall_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Billing-Role")) == true {
						DBaaS_Prod_Billing_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Admin-Role")) == true {
						DBaaS_Prod_Admin_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("PingCAP-SecurityAdmin-Role")) == true {
						PingCAP_SecurityAdmin_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-EC2-Role")) == true {
						DBaaS_Prod_EC2_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-DevUser-Role")) == true {
						DBaaS_DevUser_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Web-Role")) == true {
						DBaaS_Prod_Web_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-OrgOperator-Role")) == true {
						DBaaS_Prod_OrgOperator_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("Prod-Tiflow-Engine-RDS")) == true {
						Prod_Tiflow_Engine_RDS_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-DevLeader-Role")) == true {
						DBaaS_DevLeader_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Infra-DevUser-Role")) == true {
						DBaaS_Infra_DevUser_Role_dnum += 1
						continue
					}
					if strings.Contains(perstr, strings.ToLower("DbaaS-Prod-GlueFullAccess")) == true {
						DbaaS_Prod_GlueFullAccess_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-OnCall-BastionEC2-Role")) == true {
						DBaaS_Prod_OnCall_BastionEC2_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Support-Role")) == true {
						DBaaS_Prod_Support_Role_dnum += 1
						continue
					}

				}
				break
			case "GCP":
				if strings.Contains(perstr, "remove permission success") == true {
					GCP_del_total_num += 1
					perstr = strings.ToLower(perstr)

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-ViewOnly-Role")) == true {
						GCP_DBaaS_Prod_ViewOnly_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-DevUser-Role")) == true {
						GCP_DBaaS_Prod_DevUser_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-DevSpecial-Role")) == true {
						GCP_DBaaS_Prod_DevSpecial_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-DevAdmin-Role")) == true {
						GCP_DBaaS_Prod_DevAdmin_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Bigquery-Role")) == true {
						GCP_DBaaS_Prod_Bigquery_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Billing-Admin-Role")) == true {
						GCP_DBaaS_Prod_Billing_Admin_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Billing-ViewOnly-Role")) == true {
						GCP_DBaaS_Prod_Billing_ViewOnly_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Admin-Role")) == true {
						GCP_DBaaS_Prod_Admin_Role_dnum += 1
						continue
					}

					if strings.Contains(perstr, strings.ToLower("DBaaS-Prod-Security-Role")) == true {
						GCP_DBaaS_Prod_Security_Role_dnum += 1
						continue
					}

				}
				break
			}
		}
	}

	aws_retstr := aws_tmple_notice
	aws_retstr = strings.ReplaceAll(aws_retstr, "total_del_per_num", strconv.Itoa(int(del_total_num)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-ViewOnly-Role_dnum", strconv.Itoa(int(DBaaS_Prod_ViewOnly_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-OnCall-Role_dnum", strconv.Itoa(int(DBaaS_Prod_OnCall_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Billing-Role_dnum", strconv.Itoa(int(DBaaS_Prod_Billing_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Admin-Role_dnum", strconv.Itoa(int(DBaaS_Prod_Admin_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "PingCAP-SecurityAdmin-Role_dnum", strconv.Itoa(int(PingCAP_SecurityAdmin_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-EC2-Role_dnum", strconv.Itoa(int(DBaaS_Prod_EC2_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-DevUser-Role_dnum", strconv.Itoa(int(DBaaS_DevUser_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Web-Role_dnum", strconv.Itoa(int(DBaaS_Prod_Web_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-OrgOperator-Role_dnum", strconv.Itoa(int(DBaaS_Prod_OrgOperator_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "Prod-Tiflow-Engine-RDS_dnum", strconv.Itoa(int(Prod_Tiflow_Engine_RDS_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-DevLeader-Role_dnum", strconv.Itoa(int(DBaaS_DevLeader_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Infra-DevUser-Role_dnum", strconv.Itoa(int(DBaaS_Infra_DevUser_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DbaaS-Prod-GlueFullAccess_dnum", strconv.Itoa(int(DbaaS_Prod_GlueFullAccess_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-OnCall-BastionEC2-Role_dnum", strconv.Itoa(int(DBaaS_Prod_OnCall_BastionEC2_Role_dnum)))
	aws_retstr = strings.ReplaceAll(aws_retstr, "DBaaS-Prod-Support-Role_dnum", strconv.Itoa(int(DBaaS_Prod_Support_Role_dnum)))

	//计算非通用权限集数量
	N_Gene_num := del_total_num - (DBaaS_Prod_ViewOnly_Role_dnum +
		DBaaS_Prod_OnCall_Role_dnum +
		DBaaS_Prod_Billing_Role_dnum +
		DBaaS_Prod_Admin_Role_dnum +
		PingCAP_SecurityAdmin_Role_dnum +
		DBaaS_Prod_EC2_Role_dnum +
		DBaaS_DevUser_Role_dnum +
		DBaaS_Prod_Web_Role_dnum +
		DBaaS_Prod_OrgOperator_Role_dnum +
		Prod_Tiflow_Engine_RDS_dnum +
		DBaaS_DevLeader_Role_dnum +
		DBaaS_Infra_DevUser_Role_dnum +
		DbaaS_Prod_GlueFullAccess_dnum +
		DBaaS_Prod_OnCall_BastionEC2_Role_dnum)
	aws_retstr = strings.ReplaceAll(aws_retstr, "N_general_num", strconv.Itoa(int(N_Gene_num)))

	//处理 GCP 的权限数量
	gcp_retstr := gcp_tmple_notice
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "total_del_per_num", strconv.Itoa(int(GCP_del_total_num)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-ViewOnly-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_ViewOnly_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-DevUser-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_DevUser_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-DevSpecial-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_DevSpecial_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-DevAdmin-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_DevAdmin_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Bigquery-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_Bigquery_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Billing-Admin-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_Billing_Admin_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Billing-ViewOnly-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_Billing_ViewOnly_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Admin-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_Admin_Role_dnum)))
	gcp_retstr = strings.ReplaceAll(gcp_retstr, "DBaaS-Prod-Security-Role_dnum", strconv.Itoa(int(GCP_DBaaS_Prod_Security_Role_dnum)))

	return aws_retstr, gcp_retstr
}

/*
获取 config/notice_set.txt 中的群id chat_id 和 周:小时:分钟
返回 feis群 chat_id 和 周:小时:分钟
*/
func Get_wday_Hint_Mint() (string, string) {
	ntice_path := "./config/notice_set.txt"
	ntice_datas := Pbs.Read_txt_File(ntice_path)
	var chat_id string
	var time_date string
	for i, vus := range ntice_datas {
		vus = strings.TrimSpace(vus)
		switch i {
		case 0:
			chat_id = vus
			break
		case 1:
			time_date = vus
			break
		}
	}
	return chat_id, time_date
}

/*
判断当前是时间是否和配置的时间匹配,当前时间和配置的时间匹配返回 true 否则返回 false
带入配置的时间 set_time
*/
func Is_wint_hint_mint(set_time string) bool {
	set_time = strings.TrimSpace(set_time)
	set_time_spi := strings.Split(set_time, ":")
	if len(set_time_spi) < 3 {
		fmt.Println("Notice send time set error")
		os.Exit(0)
	}
	wstr := ""
	hstr := ""
	mstr := ""
	for i, vue := range set_time_spi {
		vue = strings.TrimSpace(vue)
		switch i {
		case 0:
			wstr = vue
			break
		case 1:
			hstr = vue
			break
		case 2:
			mstr = vue
			break
		}
	}

	currentTime := time.Now()
	// 获取周,周末为0
	dayOfWeek := currentTime.Weekday()
	cwint := int(dayOfWeek)
	scwint := strconv.Itoa(int(cwint))
	//获取小时
	chint := currentTime.Hour()
	schint := strconv.Itoa(int(chint))
	//获取分钟
	cmint := currentTime.Minute()
	scmint := strconv.Itoa(int(cmint))

	if scwint == wstr && schint == hstr && scmint == mstr {
		return true
	} else {
		return false
	}
}
