package main

// import (
// 	"context"
// 	"encoding/json"
// 	"errors"
// 	"flag"
// 	"fmt"
// 	"log/slog"
// 	"os"
// 	"path"
// 	"path/filepath"
// 	"strings"

// 	lambdacli "github.com/tidbcloud/jiraport/pkg/clients/lambda"
// 	"github.com/tidbcloud/jiraport/pkg/entity"

// 	glogger "gorm.io/gorm/logger"

// 	"github.com/spf13/viper"
// 	"gorm.io/driver/mysql"
// 	"gorm.io/gorm"
// )

// var (
// 	configPath = flag.String("config-path", "etc", "App config search path")
// )

// func main() {
// 	flag.Parse()
// 	err := LoadConfig(*configPath)
// 	if err != nil {
// 		// log have not inited, use fmt.Fprintf
// 		fmt.Fprintf(os.Stderr, "load config error: %s\n", err.Error())
// 		os.Exit(1)
// 	}

// 	opts := &slog.HandlerOptions{
// 		AddSource: true,
// 		Level:     slog.LevelDebug,
// 		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
// 			if a.Key == slog.SourceKey {
// 				s := a.Value.Any().(*slog.Source)
// 				s.File = path.Base(s.File)
// 			}
// 			return a
// 		},
// 	}
// 	loggerHandler := slog.NewTextHandler(os.Stdout, opts)
// 	logger := slog.New(loggerHandler)

// 	gormLoggerLevel := glogger.Warn
// 	if viper.GetString("mode") == "debug" {
// 		gormLoggerLevel = glogger.Info
// 	}

// 	// dataDB for data storage
// 	dataDB, err := gorm.Open(mysql.Open(viper.GetString("data-db-dsn")), &gorm.Config{
// 		PrepareStmt: false,
// 		Logger:      glogger.Default.LogMode(gormLoggerLevel),
// 	})
// 	if err != nil {
// 		logger.Error("init data db failed", "err", err)
// 		os.Exit(1)
// 	}

// 	var lambdaClient lambdacli.Interface
// 	if viper.GetBool("is-local-dev") {
// 		lambdaClient, err = lambdacli.NewLocalClient(logger, viper.GetString("resolver-function-name"))
// 		if err != nil {
// 			logger.Error("lambda client init failed", "err", err)
// 			os.Exit(1)
// 		}
// 	} else {
// 		lambdaClient, err = lambdacli.New(logger, viper.GetString("resolver-function-name"))
// 		if err != nil {
// 			logger.Error("lambda client init failed", "err", err)
// 			os.Exit(1)
// 		}
// 	}

// 	if viper.GetBool("retry-on-startup") {
// 		// will send unfinished actions to resolver
// 		err := RetryUnfinishedActions(logger, dataDB, lambdaClient)
// 		if err != nil {
// 			logger.Error("retry unfinished actions error", "err", err)
// 		}
// 	}
// }

// func RetryUnfinishedActions(
// 	logger *slog.Logger,
// 	dataDB *gorm.DB,
// 	lambdaClient lambdacli.Interface,
// ) error {
// 	actions := make([]entity.NotificationActionExecInfo, 0)
// 	err := dataDB.
// 		Where("done = ?", entity.ActionStatusPending).
// 		Preload("Notification").
// 		Preload("Notification.Issue").
// 		Find(&actions).
// 		Error
// 	if err != nil {
// 		return fmt.Errorf("get unfinished actions error %w", err)
// 	}
// 	for i := range actions {
// 		logger.Debug("retry action", "action", actions[i])
// 		payload, err := json.Marshal(actions[i])
// 		if err != nil {
// 			logger.Error("json encode failed ", "err", err, "event", actions[i])
// 		}
// 		ev := lambdacli.Event{
// 			Name:    "NotificationAction",
// 			Payload: payload,
// 		}
// 		if err := lambdaClient.InvokeAsync(context.Background(), ev); err != nil {
// 			logger.Error("invoke async failed", "err", err, "event", ev)
// 		}
// 	}
// 	return nil
// }

// // load config from configPath and set default value of some key
// func LoadConfig(configPath string) error {
// 	viper.SetDefault("mode", "debug")
// 	viper.SetDefault("is-local-dev", false)
// 	viper.SetDefault("verbose", true)
// 	viper.SetDefault("listen-address", "debug")
// 	viper.SetDefault("policy-file", "policy.yml")
// 	viper.SetDefault("template-file", "jiraport.tmpl")
// 	viper.SetDefault("need-assign", false)
// 	viper.SetDefault("receivers", make(map[string]interface{}))
// 	viper.SetDefault("assign-matcher-file", "assign.yml")
// 	viper.SetDefault("fbowner-matcher-file", "fbowner.yml")
// 	viper.SetDefault("retry-on-startup", false)
// 	viper.SetDefault("policy-matcher-file", "policy-route.yml")
// 	viper.SetDefault("event-matcher-file", "event-matcher.yml")
// 	viper.SetDefault("region-receivers", make(map[string]interface{}))
// 	viper.SetDefault("fbowner-field-name", "customfield_10634")

// 	viper.SetConfigName("config")
// 	viper.SetConfigType("yaml")
// 	viper.AddConfigPath(configPath)
// 	err := viper.ReadInConfig()
// 	if err != nil {
// 		return err
// 	}

// 	err = CheckConfig()
// 	if err != nil {
// 		return err
// 	}

// 	// resolve relative path, use config path as parent
// 	resolveRelPath := func(p string) string {
// 		if filepath.IsAbs(p) {
// 			return p
// 		}
// 		curConfigPath, _ := filepath.Split(viper.ConfigFileUsed())
// 		return filepath.Join(curConfigPath, p)

// 	}

// 	// update those file path config to absolute path
// 	viper.Set("policy-file", resolveRelPath(viper.GetString("policy-file")))
// 	viper.Set("template-file", resolveRelPath(viper.GetString("template-file")))
// 	viper.Set("assign-matcher-file", resolveRelPath(viper.GetString("assign-matcher-file")))
// 	viper.Set("fbowner-matcher-file", resolveRelPath(viper.GetString("fbowner-matcher-file")))
// 	viper.Set("policy-matcher-file", resolveRelPath(viper.GetString("policy-matcher-file")))
// 	viper.Set("event-matcher-file", resolveRelPath(viper.GetString("event-matcher-file")))

// 	// set default dsn parameters
// 	policyDSN := viper.GetString("policy-db-dsn")
// 	if !strings.ContainsRune(policyDSN, '?') {
// 		viper.Set("policy-db-dsn", policyDSN+"?charset=utf8mb4&parseTime=True&loc=Local")
// 	}
// 	dataDSN := viper.GetString("data-db-dsn")
// 	if !strings.ContainsRune(dataDSN, '?') {
// 		viper.Set("data-db-dsn", dataDSN+"?charset=utf8mb4&parseTime=True&loc=Local")
// 	}

// 	return nil
// }

// // check some required key and value
// func CheckConfig() error {
// 	if viper.GetString("notify-address") == "" {
// 		return errors.New("require valid notify address")
// 	}
// 	if viper.GetString("policy-db-dsn") == "" {
// 		return errors.New("require valid policy DSN")
// 	}
// 	if viper.GetString("data-db-dsn") == "" {
// 		return errors.New("require valid data DSN")
// 	}
// 	if viper.GetBool("need-assign") {
// 		if viper.GetString("jira-base-url") == "" {
// 			return errors.New("require valid jira base url")
// 		}
// 		if viper.GetString("jira-token") == "" {
// 			return errors.New("require valid jira token")
// 		}
// 	}
// 	return nil

// }
