package main

import (
	"context"
	"fmt"
	"jirasop/pkg/controller"
	"jirasop/pkg/infra/config"
	"jirasop/pkg/infra/log"
	"os"

	"github.com/spf13/cobra"
	"sigs.k8s.io/controller-runtime/pkg/manager/signals"
)

var (
	flagConfig string

	cmd = &cobra.Command{
		Use:     "jirasop",
		Version: "v0.0.0",
		Run:     excute,
	}
)

func init() {
	cmd.Flags().StringVar(&flagConfig, "config", "etc/config.yaml", "path to read root config")

	cmd.MarkFlagsRequiredTogether("config")
}

func excute(cmd *cobra.Command, args []string) {
	ctx := signals.SetupSignalHandler()

	conf, err := config.InitConfig(flagConfig)
	exitIfErr(err, "failed to init config")

	err = setup(ctx, conf)
	exitIfErr(err, "failed to setup")

	err = run(ctx, conf)
	exitIfErr(err, "failed to run")
}

func main() {
	err := cmd.Execute()
	exitIfErr(err, "failed to execute cmd")
}

func exitIfErr(err error, msg string) {
	if err != nil {
		if log.Logger.IsZero() {
			fmt.Fprintln(os.Stderr, err.Error())
		} else {
			log.Logger.Error(err, "exit err")
		}
		os.Exit(1)
	}
}

func run(ctx context.Context, conf *config.RootConfig) error {
	logger := log.Logger.WithName("Run")
	logger.Info("start to run jirasop server")

	controller.NewController(*conf)

	return nil
}

func setup(ctx context.Context, conf *config.RootConfig) error {
	err := log.InitLogger(&conf.Log)
	if err != nil {
		return fmt.Errorf("failed to init logger: %s", err)
	}

	return nil
}
