package utility

import (
	"fmt"
	"runtime"
	"runtime/debug"
	"strings"

	"github.com/go-admin-team/go-admin-core/logger"
)

// SafeGo 安全地启动一个 goroutine，捕获 panic
func SafeGo(fn func()) {
	go func() {
		defer func() {
			if r := recover(); r != nil {
				// 记录 Goroutine ID、panic 信息和堆栈
				logger.Error(fmt.Sprintf("Recovered from panic in Goroutine %s: %v\nStack Trace:\n%s", GetGoroutineID(), r, string(debug.Stack())))
			}
		}()
		fn()
	}()
}

// 获取 Goroutine ID
func GetGoroutineID() string {
	buf := make([]byte, 64)
	n := runtime.Stack(buf, false)
	stack := string(buf[:n])
	// 提取 Goroutine ID
	id := strings.Split(stack, " ")[1]
	return id
}

func SafeGoParam[T any](fn func(T), param T) {
	go func() {
		defer func() {
			if r := recover(); r != nil {
				logger.Error(fmt.Sprintf(" SafeGoParam Recovered from panic in Goroutine %s: %v\nStack Trace:\n%s", GetGoroutineID(), r, string(debug.Stack())))
			}
		}()
		fn(param) // 执行传入的函数
	}()
}
