package progress

import (
	"context"
	"log"
	"net/http"
	"os"
	"sync"
	"time"
)

func CheckActive(ctx context.Context) {
	ticker := time.NewTicker(1 * time.Minute)
	defer ticker.Stop()

	activeCheckWg := sync.WaitGroup{}
	activeCheckWg.Add(1)

	go func() {
		defer activeCheckWg.Done()
		for {
			select {
			case <-ticker.C:
				checkInactiveProcesses()
			case <-ctx.Done():
				return
			}
		}
	}()
}

func checkInactiveProcesses() {
	processesMu.RLock()
	defer processesMu.RUnlock()

	for name, p := range processes {
		// 检查进程是否还在运行
		pid := p.Cmd.Process.Pid
		_, err := os.FindProcess(pid)
		if err != nil {
			p.Running = false
			// 进程已不存在,跳过后续检查
			continue
		}

		// 如果进程还在运行,检查/ping接口
		if p.Running {
			resp, err := http.Get(p.PingURL)
			if err != nil {
				p.Running = false
				// 进程未响应
				log.Printf("Error checking ping for process %s: %v", name, err)
				continue
			}
			defer resp.Body.Close()

			if resp.StatusCode != http.StatusOK {
				p.Running = false
				// 进程未正常响应,停止进程
				if err := p.Cmd.Process.Signal(os.Kill); err != nil {
					log.Printf("Failed to stop process %s before restart: %v", name, err)
					continue
				}
			} else {
				// 进程正常响应,更新LastPingAt并继续检查下一个进程
				p.LastPing = time.Now()
			}
		}
	}
}