package main

import (
	"context"
	"log/slog"
	"net/http"
	"os"
	"time"

	"github.com/reugn/go-quartz/job"
	"github.com/reugn/go-quartz/logger"
	"github.com/reugn/go-quartz/quartz"
)

func main() {
	// 创建一个可取消的上下文,用于控制调度器和作业的生命周期
	ctx, cancel := context.WithCancel(context.Background())
	// 确保在函数结束时取消上下文,防止资源泄露
	defer cancel()

	// 创建调度器并配置日志记录器
	// 1. 首先创建标准日志处理器输出到标准输出
	slogLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
	// 2. 使用WithLogger选项创建标准调度器,忽略可能的错误
	scheduler, _ := quartz.NewStdScheduler(quartz.WithLogger(logger.NewSlogLogger(ctx, slogLogger)))

	// 启动调度器,开始处理作业
	scheduler.Start(ctx)

	// 创建不同类型的作业和触发器
	// 1. 创建一个Cron触发器,每5秒执行一次 (1/5 * * * * *)
	cronTrigger, _ := quartz.NewCronTrigger("1/5 * * * * *")
	// 2. 创建一个执行Shell命令的作业
	shellJob := job.NewShellJob("ls -la")

	// 3. 创建一个HTTP请求,用于后续的CURL作业
	request, _ := http.NewRequest(http.MethodGet, "https://worldtimeapi.org/api/timezone/utc", nil)
	// 4. 创建一个发送HTTP请求的作业
	curlJob := job.NewCurlJob(request)

	// 5. 创建一个执行自定义函数的作业
	functionJob := job.NewFunctionJob(func(_ context.Context) (int, error) { return 1, nil })

	// 向调度器注册作业
	// 1. 注册shellJob,使用cronTrigger触发器
	_ = scheduler.ScheduleJob(quartz.NewJobDetail(shellJob, quartz.NewJobKey("shellJob")),
		cronTrigger)
	// 2. 注册curlJob,使用SimpleTrigger,每7秒执行一次
	_ = scheduler.ScheduleJob(quartz.NewJobDetail(curlJob, quartz.NewJobKey("curlJob")),
		quartz.NewSimpleTrigger(7*time.Second))
	// 3. 注册functionJob,使用SimpleTrigger,每5秒执行一次
	_ = scheduler.ScheduleJob(quartz.NewJobDetail(functionJob, quartz.NewJobKey("functionJob")),
		quartz.NewSimpleTrigger(5*time.Second))

	// 停止调度器,不再接受新的作业
	scheduler.Stop()

	// 等待所有正在执行的作业完成
	scheduler.Wait(ctx)
}