package main

import (
	"context"
	"flag"
	"fmt"
	"os"
	"tydata-server/app/main/api/internal/config"
	"tydata-server/app/main/api/internal/handler"
	"tydata-server/app/main/api/internal/middleware"
	"tydata-server/app/main/api/internal/queue"
	"tydata-server/app/main/api/internal/svc"

	"github.com/zeromicro/go-zero/core/logx"

	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/rest"
)

func main() {
	// 读取环境变量 ENV，默认为 "prod"
	env := os.Getenv("ENV")
	if env == "" {
		env = "production"
	}

	// 根据 ENV 加载不同的配置文件
	var defaultConfigFile string
	if env == "development" {
		defaultConfigFile = "app/main/api/etc/main.dev.yaml"
	} else {
		defaultConfigFile = "etc/main.yaml"
	}
	configFile := flag.String("f", defaultConfigFile, "the config file")
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)

	svcContext := svc.NewServiceContext(c)
	defer svcContext.Close()

	// 启动 asynq 消费者
	go func() {
		ctx := context.Background()
		// 初始化 cron job 或异步任务队列
		asynq := queue.NewCronJob(ctx, svcContext)
		mux := asynq.Register()

		// 启动 asynq 消费者
		if err := svcContext.AsynqServer.Run(mux); err != nil {
			logx.WithContext(ctx).Errorf("异步任务启动失败: %v", err)
			os.Exit(1)
		}
		fmt.Println("异步任务启动！！！")
	}()

	server := rest.MustNewServer(c.RestConf)
	server.Use(middleware.GlobalSourceInterceptor)
	defer server.Stop()

	handler.RegisterHandlers(server, svcContext)

	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
	server.Start()
}
