package service

import (
	"os"
	"os/exec"
	"syscall"
	"time"

	"go.uber.org/zap"
)

// RestartCoreService 重启核心服务（用于管理员操作）
type RestartCoreService struct {
	logger *zap.Logger
}

// NewRestartCoreService 创建重启核心服务
func NewRestartCoreService(logger *zap.Logger) *RestartCoreService {
	return &RestartCoreService{
		logger: logger,
	}
}

// RestartCore 重启核心服务（优雅重启）
func (s *RestartCoreService) RestartCore() error {
	s.logger.Info("开始重启核心服务...")

	// 1. 记录当前进程 ID
	pid := os.Getpid()
	s.logger.Info("当前进程 ID", zap.Int("pid", pid))

	// 2. 获取当前可执行文件路径
	execPath, err := os.Executable()
	if err != nil {
		s.logger.Error("获取可执行文件路径失败", zap.Error(err))
		return err
	}

	// 3. 启动新进程
	cmd := exec.Command(execPath)
	cmd.SysProcAttr = &syscall.SysProcAttr{
		HideWindow:    true,                             // Windows 隐藏窗口
		CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, // Windows 创建新进程组
	}

	if err := cmd.Start(); err != nil {
		s.logger.Error("启动新进程失败", zap.Error(err))
		return err
	}

	s.logger.Info("新进程启动成功", zap.Int("new_pid", cmd.Process.Pid))

	// 4. 等待一小段时间确保新进程稳定
	time.Sleep(2 * time.Second)

	// 5. 退出当前进程
	s.logger.Info("当前进程即将退出")
	os.Exit(0)

	return nil
}
