// Copyright (c) 2026 S.A. (SNOWARE). Written for SCU Team.
// Licensed under MulanPubL-2.0.
// You may obtain a copy at: http://license.coscl.org.cn/MulanPubL-2.0
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND.

// main 包：SRemoteConnectClient 主入口，负责 UAC 提权、启动 EasyTier 子进程、系统托盘管理。
package main

import (
	"os"
	"os/exec"

	"github.com/getlantern/systray"
)

// proc 保存 EasyTier 子进程的引用，用于退出时清理。
var proc *os.Process = nil

// main 程序入口：初始化日志 → 隐藏控制台 → UAC 提权 → 启动 EasyTier → 系统托盘。
func main() {
	initLogger()
	log.Info().Msg("程序启动")

	hideConsoleWindow()

	p := NewPermission()
	if !p.HasUAC() {
		log.Warn().Msg("未检测到管理员权限，尝试提权运行")
		p.runSelfAsAdmin()
		return
	}
	log.Info().Msg("管理员权限已确认")

	log.Info().Msg("开始连接虚拟热点")
	proc = connectToVirtualHotspot()

	defer cleanup()

	log.Info().Msg("启动系统托盘")
	systray.Run(onReady, onExit)
}

// onReady 系统托盘就绪回调：设置图标、工具提示、构建右键菜单、注册各菜单项的点击事件。
func onReady() {
	log.Info().Msg("系统托盘就绪")

	icon := loadIcon()
	systray.SetIcon(icon)

	systray.SetTooltip("若一切正常，您现可连接到SCU的所有队内服务")

	mTitle := systray.AddMenuItem("<<*>> SCU Remote Connect Client", "已连接")
	mTitle.Disable()
	systray.AddSeparator()

	mQuit := systray.AddMenuItem("退出", "退出程序，关闭现有连接")
	mVisitGitea := systray.AddMenuItem("访问代码托管服务 Gitea", "SASWE 代码托管服务")
	mVisitCloudreve := systray.AddMenuItem("访问文件分发服务 Cloudreve", "SASWE 小文件分发服务")
	systray.AddSeparator()
	mShowConsoleWindow := systray.AddMenuItem("显示控制台窗口", "调试用")
	mHideConsoleWindow := systray.AddMenuItem("隐藏控制台窗口", "调试用")

	// 退出按钮 → 调用 systray.Quit() 触发 onExit
	go func() {
		<-mQuit.ClickedCh
		log.Info().Msg("用户点击退出")
		systray.Quit()
	}()

	// 访问 Gitea → 浏览器打开 SASWE 代码托管
	go func() {
		<-mVisitGitea.ClickedCh
		log.Info().Msg("用户点击访问 Gitea")
		exec.Command("cmd", "/c", "start", "http://103.217.186.98:3000/").Start()
	}()

	// 访问 Cloudreve → 浏览器打开 SASWE 文件分发
	go func() {
		<-mVisitCloudreve.ClickedCh
		log.Info().Msg("用户点击访问 Cloudreve")
		exec.Command("cmd", "/c", "start", "http://103.217.186.98:5212/").Start()
	}()

	// 显示控制台 → 调用 showConsoleWindow()
	go func() {
		<-mShowConsoleWindow.ClickedCh
		log.Info().Msg("用户点击显示控制台窗口")
		showConsoleWindow()
	}()

	// 隐藏控制台 → 调用 hideConsoleWindow()
	go func() {
		<-mHideConsoleWindow.ClickedCh
		log.Info().Msg("用户点击隐藏控制台窗口")
		hideConsoleWindow()
	}()
}

// onExit 系统托盘退出回调：清理子进程并记录退出日志。
func onExit() {
	cleanup()
	log.Info().Msg("程序退出")
}

// cleanup 终止 EasyTier 子进程，防止残留进程占用端口。
func cleanup() {
	if proc != nil {
		log.Info().Int("pid", proc.Pid).Msg("终止 EasyTier 进程")
		if err := proc.Kill(); err != nil {
			log.Warn().Err(err).Msg("终止 EasyTier 进程失败")
		}
	}
}
