package main

import (
	"center-api/internal/conf"
	log2 "center-api/internal/pkg/log"
	"flag"
	"fmt"
	"github.com/go-kratos/kratos/v2"
	"github.com/go-kratos/kratos/v2/config"
	"github.com/go-kratos/kratos/v2/config/file"
	"github.com/go-kratos/kratos/v2/log"
	"github.com/go-kratos/kratos/v2/transport/http"
	_ "go.uber.org/automaxprocs"
	"os"
	"path/filepath"
)

// go build -ldflags "-X main.Version=x.y.z"
var (
	// Name is the name of the compiled software.
	Name string = "marketingApi"
	// Version is the version of the compiled software.
	Version string
	// flagconf is the config flag.
	flagconf string

	id, _ = os.Hostname()
)

func newApp(
	logger log.Logger,
	httpServer *http.Server,
) *kratos.App {
	return kratos.New(
		kratos.ID(id),
		kratos.Name(Name),
		kratos.Version(Version),
		kratos.Logger(logger),
		kratos.Server(
			httpServer,
		),
	)
}

func main() {
	bc := loadConfig()
	businessLogger := log2.NewBusinessLogger(bc, id, Name, Version)
	accessLogger := log2.NewAccessLogger(bc, id, Name, Version)

	app, cleanup, err := wireApp(bc, businessLogger, accessLogger)
	if err != nil {
		panic(err)
	}
	defer cleanup()

	// start and wait for stop signal
	if err := app.Run(); err != nil {
		panic(err)
	}
}

func loadConfig() *conf.Bootstrap {
	flag.StringVar(&flagconf, "conf", "./configs", "config path, eg: -conf config.yaml")
	flag.Parse()

	//支持子目录, 线上的系统配置会挂载为子目录
	sources := make([]config.Source, 0)
	err := filepath.Walk(flagconf, func(path string, info os.FileInfo, err error) error {
		if err == nil && info.IsDir() {
			sources = append(sources, file.NewSource(path))
		}
		return nil
	})
	if err != nil {
		fmt.Printf("filepath.Walk() returned %+v \n", err)
		panic(err)
	}

	c := config.New(
		config.WithSource(sources...),
	)
	defer c.Close()

	if err = c.Load(); err != nil {
		panic(err)
	}

	bc := &conf.Bootstrap{}
	if err = c.Scan(bc); err != nil {
		panic(err)
	}

	fmt.Printf("已加载的配置数据：%+v\n", bc)
	return bc
}
