package main
import (
	"github.com/lxn/walk"
	pub "AD-Control/public"
)


//---------------------------------------------------------
//
//    Power
//
//---------------------------------------------------------

// 电源菜单
func menuInitPower(ni * walk.NotifyIcon){
	fa := "电源选项"
	sub := [...]string{"关闭系统","用户注销","重启系统","取消关机计时"}
	
	// 建立空菜单
	nm,err := walk.NewMenu()
	if err != nil {
		pub.PntError(err)
	}

	for i,buttonText := range sub{
		// 建立 子按钮
		na := walk.NewAction()
		if err := na.SetText(buttonText); err != nil {
			pub.PntError(err)
		}

		// 为子按钮 添加事件
		switch i{
		case 0:
			na.Triggered().Attach(pCloseWindows)
		case 1:
			na.Triggered().Attach(pLogOffUser)
		case 2:
			na.Triggered().Attach(pRebootWindows)
		case 3:
			na.Triggered().Attach(pCancelCloseWindows)
		
		}

		// 将 子按钮 添加到 菜单
		nm.Actions().Add(na)
	}
	//将菜单添加到托盘
	sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
	if err != nil {
		pub.PntError(err)
	}

	// 主菜单 属性
	sysmenu.SetText(fa)
	sysmenu.SetVisible(true)
	sysmenu.SetEnabled(true)
}
// 电源管理 关机
func pCloseWindows(){
	pub.SendServerExec(pub.Msg_Exec_TurnOffPC)
}
// 电源管理 注销用户
func pLogOffUser(){
	pub.SendServerExec(pub.Msg_Exec_LogOffUser)

}
// 电源管理 重启主机
func pRebootWindows(){
	pub.SendServerExec(pub.Msg_Exec_RebootWindows)

}
// 电源管理 取消自动关机
func pCancelCloseWindows(){
	pub.SendServerExec(pub.Msg_Exec_CancelTurnOffPC)
}


//--------------------------------------------------------------------
//
//    Software Install
//
//--------------------------------------------------------------------

// 软件安装
func menuInitSoftwareInstall(ni * walk.NotifyIcon){
	fa := "软件安装"
	// 建立空菜单
	nm,err := walk.NewMenu()
	if err != nil {
		pub.PntError(err)
	}
	list,err := pub.ReadDir(pub.SMB_ADSoftlike)
	if err != nil {
		pub.PntError(err)
	}
	for _,ueach := range list{
		each := ueach.Name()
		if each == ".DS_Store"{
			continue
		}
		each_noext := pub.TrimSuffix(pub.TrimSuffix(ueach.Name(),".exe"),".msi")

		// 建立 子按钮
		na := walk.NewAction()
		if err := na.SetText(each_noext); err != nil {
			pub.PntError(err)
		}

		// 为子按钮 添加事件
		na.Triggered().Attach(func() {
			siEnter_admin(each)
		})

		// 将 子按钮 添加到 菜单
		nm.Actions().Add(na)
	}
	//将菜单添加到托盘
	sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
	if err != nil {
		pub.PntError(err)
	}

	// 主菜单 属性
	sysmenu.SetText(fa)
	sysmenu.SetVisible(true)
	sysmenu.SetEnabled(true)
}
// 软件安装 进行安装
func siEnter_admin(softname string){
	go pub.Msg("等待弹出安装窗口，请稍等。。")
	ifFile := pub.Exist(`C:\windows\`+softname)
	pub.SendServer(pub.GJexecInstallSoftware(ifFile,softname))

}


//---------------------------------------------------------------
//
//     WxDrive Sync
//
//---------------------------------------------------------------

// 微盘同步
func menuInitWxDriveSync(ni * walk.NotifyIcon){
	fa := "微盘同步"
	sub := [...]string{"初始化","同步部门共享盘到微盘（自动）","同步微盘部门共享文件到本地服务器（手动）","说明"}
	// 建立空菜单
	nm,err := walk.NewMenu()
	if err != nil {
		pub.PntError(err)
	}

	for i,buttonText := range sub{
		// 建立 子按钮
		na := walk.NewAction()
		if err := na.SetText(buttonText); err != nil {
			pub.PntError(err)
		}

		// 为子按钮 添加事件
		switch i{
		case 0:
			na.Triggered().Attach(wxdsInit)
		case 1:
			na.Triggered().Attach(wxdsToDrive)
		case 2:
			na.Triggered().Attach(wxdsToServer)
		case 3:
			na.Triggered().Attach(wxdsExplain)
		
		}

		// 将 子按钮 添加到 菜单
		nm.Actions().Add(na)
	}

	//将菜单添加到托盘
	sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
	if err != nil {
		pub.PntError(err)
	}

	// 主菜单 属性
	sysmenu.SetText(fa)
	sysmenu.SetVisible(true)
	sysmenu.SetEnabled(true)
}
// 微盘同步 初始化
func wxdsInit(){
	explain								:= "选择个人ID（一般是168开头），请根据微盘的文件夹所在位置进行选择，确定并选择并点击文件夹（一串数字）后，点击确定继续进行下一步！具体操作方法点击说明！"
	var FullWeDrive						string
	for _,i := range pub.Dir_WeDrive{
		if pub.Exist(i + `\Global`){
			FullWeDrive 				= pub.ChooseFolder(&explain,&i)+`\WeDrive\知微数据`
			continue
		}
	}

	pub.PntInfo(FullWeDrive)
	if pub.NotExist(FullWeDrive){
		pub.Msg("不存在知微数据文件夹，请重新选择")
		return
	}
	pub.Reg_Write_DC(
		pub.Reg_Name_WeDriveDir,
		FullWeDrive)
	pub.Msg("初始化完毕,请在微盘中创建文件夹（办公室部门内部共享），并分享给同事，创建后，点击开始同步即可。")
}
// 微盘同步 同步到微盘
func wxdsToDrive(){
	if pub.Msg_YesNo("确定手动进行一次 -> 从共享盘同步到微盘吗？如果调整过共享盘的文件结构，请先在微盘中同步调整，否则微盘将会混沌。")==1{
		pub.SendServer(pub.GJexecCopyWeDrive(pub.Msg_Exec_CopyWeDrive))
		pub.Msg("同步完成！")
	}

}
// 微盘同步 同步到服务器
func wxdsToServer(){
	reg_Value_WeDriveDir	:= pub.Reg_Query_DC(pub.Reg_Name_WeDriveDir)
	weDrive_Share_Dir		:= reg_Value_WeDriveDir +`\` + pub.Dir_dept_share
	if reg_Value_WeDriveDir != "" && pub.Exist(weDrive_Share_Dir){
		if pub.Msg_YesNo("确定手动进行一次 -> 从微盘到共享盘吗？如果俩者文件结构不一致，文件盘将会混沌。")==1{
			cmd := `cmd /c xcopy ` + weDrive_Share_Dir + pub.SMB_ADMainDeptShare + "/D /S /E /C /y"

			pub.Execcmd_wait(cmd)
			pub.SendServerReport(pub.Msg_Report_OverCopyToDeptShare)
			pub.Msg("同步完成！")
		}
	}else{
		pub.Msg("未进行初始化或当前微盘路径错误，请重新初始化。微盘路径信息："+reg_Value_WeDriveDir)
	}
} 

// 微盘同步 说明
func wxdsExplain(){
	msg :=`
	1.此功能，部门内部的路人甲初始化一次即可，并分享微盘文件夹给炮灰乙、流氓丙即可。

	2.当路人甲没有启动这个小工具时，土匪丁想要同步的话，也时需要初始化。

	5.初始化后，凡是启动了小工具，2小时自动同步一次到微盘。但从微盘同步到部门共享盘中只能是手动的。

	7.但限于微盘的特性，当文件共享盘的文件名发生变化，微盘是依旧保留旧文件夹的。所以微盘的文件时需要定期手动清理的。

	9.关于初始化中路径选择问题：打开微盘，右键打开已下载的文件。根据该文件所在的路径来确定初始化中的路径。

	8.以上，此致，敬礼，望赞！
	`
	pub.Msg(msg)

}


//---------------------------------------------------------------
//
//     Kinds of Tools
//
//---------------------------------------------------------------

// 其他工具
func menuInitTools(ni * walk.NotifyIcon){
	fa := "工具集合"

	sub := [...]string{"Excel关键词分割","备份用户文件","隐藏桌面图标","显示桌面图标","更新手机代理程序","移动硬盘(胡一波)","键盘驱动（徐文强）","测试"}
	// 建立空菜单
	nm,err := walk.NewMenu()
	if err != nil {
		pub.PntError(err)
	}
	lastone := len(sub)-1
	for i,buttonText := range sub{
		
		// 过滤按钮
		switch i{
		case lastone-2:
			if ! pub.TheUser(pub.AD_User_huyibo) {continue}
		case lastone-1:
			if ! pub.TheUser(pub.AD_User_xuwenqiang) {continue}
			
		case lastone:
			if ! pub.AdminUser(&pub.User_name) {continue}
		}

		// 建立 子按钮
		na := walk.NewAction()
		if err := na.SetText(buttonText); err != nil {
			pub.PntError(err)
		}

		// 为子按钮 添加事件
		switch i{
		case 0:
			na.Triggered().Attach(tMultiSplit)
		case 1:
			na.Triggered().Attach(tBakcupUser)
		case 2:
			na.Triggered().Attach(tHideIcon)
		case 3:
			na.Triggered().Attach(tShowIcon)
		case 4:
			na.Triggered().Attach(tUpdateATool)
		case lastone-2:
			na.Triggered().Attach(t_movedisk_huyibo)
		case lastone-1:
			na.Triggered().Attach(t_keyboard_xuwenqiang)
		case lastone:
			na.Triggered().Attach(tTest)
		
		}

		// 将 子按钮 添加到 菜单
		nm.Actions().Add(na)
	}

	//将菜单添加到托盘
	sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
	if err != nil {
		pub.PntError(err)
	}

	// 主菜单 属性
	sysmenu.SetText(fa)
	sysmenu.SetVisible(true)
	sysmenu.SetEnabled(true)
	
}
// 其他工具 Excel关键词分割器
func tMultiSplit(){
	pub.Execcmd_nowait(pub.Cmd_K_Start + pub.App_MultiSplit)
}
// 其他工具 备份用户文件
func tBakcupUser(){
	if pub.Msg_YesNo("是否执行一次手动备份用户文件夹。目标文件夹："+pub.User_profile)==1{
		pub.SendServerReport(pub.Msg_Report_StartBak)
	}
}

// 其他工具 更新手机代理程序
func tUpdateATool(){
	pub.Execcmd_wait(`xcopy \\adserver\software\phoneproxy\ATools\win-unpacked C:\Application\win-unpacked /D /S /E /C /y`)
	pub.Msg("更新完成")

}
// 其他工具 移动硬盘（胡一波专用）
func t_movedisk_huyibo(){
	pub.SendDaemonExec(`F:\SamsungPortableSSD.exe`)
}
func t_keyboard_xuwenqiang(){
	pub.SendServerGUIExec(`start C:\Users\Public\Desktop\Durgod_Zeus_Engine.lnk`)
}
// 其他工具 隐藏图标
func tHideIcon(){
	pub.Msg("emmmmmmm,大概下周吧，这周无望哈")
}
// 其他工具 显示图标
func tShowIcon(){
	pub.Msg("仅供参考！！")
}
// 其他工具 测试
func tTest(){
	//pub.SendDaemonExec(`D:\WXWork.exe`)
}


//---------------------------------------------------------------
//
//     File share
//
//---------------------------------------------------------------

// 文件共享 （包含域用户和大屏主机的文件共享）
func menuInitFileShares(ni * walk.NotifyIcon){
	fa := "文件共享"

	// // 建立空菜单
	mfs,err := walk.NewMenu()
	if err != nil {
		pub.PntError(err)
	}

	// 说明：添加 域用户 文件共享
	// 方法：列举目录名，生成菜单
	// 其次，列举额目录中的名单作为按钮添加到菜单
	deptList,err := pub.ReadDir(pub.SMB_ADMain)
	if err !=nil {
		pub.PntError(err)
	}
	for _,memberList := range deptList {
		nm,err := walk.NewMenu()
		if err != nil {
			pub.PntError(err)
		}
		deptshare := memberList.Name()
		// 不在 其他共享 里 显示自己部门的共享
		if deptshare == pub.SMB_ADMainDept{
			continue
		}
		member,err := pub.ReadDir(pub.SMB_ADMain + `\` + deptshare)
		if err != nil {
			pub.PntError(err)
		}
		for _,mem := range member{
			wokrer := mem.Name()
			
			// 建立 子按钮
			na := walk.NewAction()
			if err := na.SetText(pub.TrimSuffix(wokrer,".lnk")); err != nil {
				pub.PntError(err)
			}

			// 为子按钮 添加事件
			na.Triggered().Attach(func(){pub.OpenWindow(pub.SMB_ADMain + `\` + deptshare + `\` + wokrer);return})
				
			// 将 子按钮 添加到 菜单 
			nm.Actions().Add(na)
	
		}
		if m,err := mfs.Actions().AddMenu(nm);err != nil{
			pub.PntError(err)
		}else{
			m.SetText(deptshare)
			m.SetVisible(true)
			m.SetEnabled(true)

		}
	}

	// 添加
	na := walk.NewAction()
	if err := na.SetText("会议室的大脸机"); err != nil {
		pub.PntError(err)
	}else{
		//将菜单添加到托盘
		na.Triggered().Attach(func(){pub.OpenWindow(`ftp://adserver`)})
		if err := mfs.Actions().Add(na);err != nil{
			pub.PntError(err)
		}
	}

    //将菜单添加到托盘
	sysmenu,err := ni.ContextMenu().Actions().AddMenu(mfs)
	if err != nil {
			pub.PntError(err)
	}
	// 主菜单 属性
	sysmenu.SetText(fa)
	sysmenu.SetVisible(true)
	sysmenu.SetEnabled(true)

}


//---------------------------------------------------------------
//
//     My share
//
//---------------------------------------------------------------

func menuInitMyShares(ni * walk.NotifyIcon){

	fa := "我的共享"

	// 建立空菜单
	nm,err2 := walk.NewMenu()
	if err2 !=nil {
		pub.PntError(err2)
	}
	// 读取我的部门共享目录
	deptList,err3 := pub.ReadDir(pub.SMB_ADMainDept)
	if err3 !=nil {
		pub.PntError(err3)
	}

	for _,mem := range deptList{
		wokrer := mem.Name()

		// 建立 子按钮
		na := walk.NewAction()
		if err := na.SetText(pub.TrimSuffix(wokrer,".lnk")); err != nil {
			pub.PntError(err)
		}

		// 为子按钮 添加事件
		na.Triggered().Attach(func(){pub.OpenWindow(pub.SMB_ADMainDept +`\`+ wokrer);return})
			
		// 将 子按钮 添加到 菜单 
		nm.Actions().Add(na)

	}
	//将菜单添加到托盘
	sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
	if err != nil {
		pub.PntError(err)
	}

	// 主菜单 属性
	sysmenu.SetText(fa)
	sysmenu.SetVisible(true)
	sysmenu.SetEnabled(true)
}

