package feishu

import (
	"AutoSSO/awssso"
	"AutoSSO/gcpsso"
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"time"
	"unicode"
)

// This array stores the instances that have not yet passed
var Wait_Addpermiss_Ins []string

/*
Monitor for new application IDs
*/
func Check_New_Instance_IDs() {
	for {
		Instrances_IDS, err := Get_New_Instanceids()
		if err != nil {
			continue
		}
		idsspi := strings.Split(Instrances_IDS, "\n")
		if len(idsspi) >= 1 {
			for _, insid := range idsspi {
				if strings.Contains(Instances_IDS_Str, insid) == false {
					Instances_IDS_Str = Instances_IDS_Str + insid + "\n"
					WriteData_To_File(Config_instance_Path, Instances_IDS_Str)
					//fmt.Println(insid)
					//这是新的insid，开始获取该新实例 ID 的详细信息
					fsdata, err := Instanceid_To_Feishudata(insid)
					fmt.Printf("New instance --> ")
					fmt.Println(fsdata)
					if err != nil {
						continue
					}
					if fsdata.email != "" && fsdata.apptype == true && fsdata.prodaccount != "" && fsdata.ssopermissions[0] != "" {
						Wait_Addpermiss_Ins = append(Wait_Addpermiss_Ins, insid)
					}
				}
			}
		}

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

// 检查是否在三天的删除列表中,如果在三天的删除列表中，则从文档 wait_delete_up.txt 中直接移除,perinfo 38083844xxxxx|xxxxxx@pingcap.com|DBaaS-Prod-OnCall-Role
func Check_Del_three_Days(perinfo string) {
	filepath, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		fmt.Println(err)
	}
	wait_delete_upfile := filepath + `/config/wait_delete_up.txt`
	Lockroute.Lock()
	wait_delstr := Read_txt_File(wait_delete_upfile)
	Lockroute.Unlock()
	perallstr := ""
	if wait_delstr != "" {
		wait_del_spi := strings.Split(wait_delstr, "\n")
		if len(wait_del_spi) >= 1 {
			for _, wait_del_per := range wait_del_spi {
				if strings.Contains(wait_del_per, perinfo) == false {
					perallstr = perallstr + wait_del_per + "\n"
				}
			}
		}
	}
	//重新写入
	Lockroute.Lock()
	WriteData_To_File(wait_delete_upfile, perallstr)
	Lockroute.Unlock()
}

/*
Monitor the Wait_Addpermiss_Ins[] array, if there is an approved and qualified one,
perform the operation of granting permission,
and then remove the fsdata item that has been granted permission
*/
func Monitor_Addper() {
	fmt.Printf("\x1b[%dmStart monitoring new instance id \x1b[0m\n", 37)
	for {
		if len(Wait_Addpermiss_Ins) >= 1 {
			for id, fsinstance := range Wait_Addpermiss_Ins {
				fsdata, err := Instanceid_To_Feishudata(fsinstance)
				if err != nil {
					continue
				}
				if fsdata.isapproved == true { //申请通过才显示
					fmt.Printf("Approved --> ")
					fmt.Println(fsdata)
					/*
						Start adding permissions
					*/

					cloud_type, cerr := Is_AWS_GCP(fsdata)
					if cerr != nil {
						continue
					}

					switch cloud_type {
					case "AWS":
						AWS_Add_Permissions(fsdata.prodaccount, fsdata.email, fsdata.ssopermissions, fsdata.cnemail)
						break
					case "GCP":
						GCP_Add_Permissions(fsdata.prodaccount, fsdata.email, fsdata.ssopermissions, fsdata.cnemail)
						break
					}

					//After the permission is successfully added, remove the instance ID
					Wait_Addpermiss_Ins = RemoveAtIndex(Wait_Addpermiss_Ins, id)

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

// 代入 fsdata,判断是 AWS 还是 GCP
func Is_AWS_GCP(fsdata FeishuData) (string, error) {
	var rets string
	cloud_account := fsdata.prodaccount
	pdstr := isAllDigits(cloud_account)
	if pdstr == true {
		rets = "AWS"
	} else if pdstr == false {
		rets = "GCP"
	}
	return rets, nil
}

// 全数字输出 true, 含有字母为 false
func isAllDigits(s string) bool {
	for _, r := range s {
		if !unicode.IsDigit(r) {
			return false
		}
	}
	return true
}

/*
这里是增加 GCP 权限的函数,account 为账号，user 为用户邮箱，perspi 为权限集，这里为数组
最后的 cnemail 为新飞书的邮箱
*/
func GCP_Add_Permissions(account string, user string, perspi []string, cnemail string) {
	if account != "" && user != "" && len(perspi) >= 1 {
		for _, permstr := range perspi { //遍历数组中的每一个权限集
			//开始检查是否包含在 wait_delete_up.txt 中(//现在是在添加权限集之前，还需要检查该权限集是否在3天的移除范围之内)
			chstr := account + "|" + user + "|" + permstr
			Check_Del_three_Days(chstr)
			gerr := gcpsso.GCP_Add_Custom_roles(account, user, perspi)

			if gerr == nil { //权限添加成功后，给申请人员发送消息
				ntime := time.Now().Format("2006-01-02 15:04:05")
				Writelog_To_File("./log/add_permission_log", ntime+" "+account+" "+user+" "+permstr+" add permissions success("+cnemail+")")
				fmt.Println(ntime + " --> " + account + " " + user + " " + permstr + " add permissions success(" + cnemail + ")")
				//发送飞书提醒消息
				send_feishu_message := strings.ReplaceAll(GCP_Add_Permission_notice, "permission_name", permstr)
				fserr := Send_User_Notice(cnemail, "GCP SSO 权限申请反馈通知", send_feishu_message)
				if fserr == nil {
					fmt.Println("send feishu notice message success")
				} else {
					fmt.Println("send feishu notice message failed")
				}

				fmt.Println("")
			} else {
				fmt.Println(gerr)
				continue
			}
		}
	}
}

/*
这里是增加 AWS 权限的函数,account 为账号，user 为用户邮箱，perspi 为权限集，这里为数组
最后的 cnemail 为新飞书的邮箱
*/
func AWS_Add_Permissions(account string, user string, perspi []string, cnemail string) {
	if account != "" && user != "" && len(perspi) >= 1 {
		for _, permstr := range perspi { //遍历数组中的每一个权限集
			//开始检查是否包含在 wait_delete_up.txt 中(//现在是在添加权限集之前，还需要检查该权限集是否在3天的移除范围之内)
			chstr := account + "|" + user + "|" + permstr
			Check_Del_three_Days(chstr)

			//获取用户 ID
			uid, uerr := awssso.Get_User_ID(user)
			if uerr != nil || uid == "" {
				fmt.Println(uerr)
				return
			}

			//获取权限集的 ARN
			per_arn, perr := awssso.Get_Permissions_ARN(permstr)
			if perr != nil {
				fmt.Println(perr)
				return
			}

			//开始添加权限
			var userinfo awssso.Add_Per_User_Info
			userinfo.Account = account
			userinfo.User_id = uid
			userinfo.Permission_set_arn = per_arn
			err := userinfo.Add_Permission_To_Account()
			if err == nil { //权限添加成功后，给申请人员发送消息
				ntime := time.Now().Format("2006-01-02 15:04:05")
				Writelog_To_File("./log/add_permission_log", ntime+" "+account+" "+user+" "+permstr+" add permissions success("+cnemail+")")
				fmt.Println(ntime + " --> " + account + " " + user + " " + permstr + " add permissions success(" + cnemail + ")")
				//发送飞书提醒消息
				send_feishu_message := strings.ReplaceAll(AWS_Add_Permission_notice, "permission_name", permstr)
				fserr := Send_User_Notice(cnemail, "AWS SSO 权限申请反馈通知", send_feishu_message)
				if fserr == nil {
					fmt.Println("send feishu notice message success")
				} else {
					fmt.Println("send feishu notice message failed")
				}

				fmt.Println("")
			} else {
				fmt.Println(err)
				continue
			}
		}
	}
}

/*
Bring the specified subscript into the array,
remove the subscript item brought in, and return the removed array
*/
func RemoveAtIndex(arr []string, index int) []string {
	if index >= len(arr) {
		return arr
	}
	return append(arr[:index], arr[index+1:]...)
}

// 一些日志，这里是追加写入
func Writelog_To_File(FilePathName string, Datastr string) error {
	Datastr = Datastr + "\n"
	f, err := os.OpenFile(FilePathName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		return err
	}

	_, err = f.Write([]byte(Datastr))
	if err != nil {
		return err
	}
	f.Close()
	return nil
}
