package cmd

import (
	"context"
	"os"

	"git.ar21.de/yolokube/grafana-backuper/internal/config"
	"git.ar21.de/yolokube/grafana-backuper/pkg/grafanabackuper"
	"github.com/rs/zerolog/log"
	"github.com/spf13/cobra"
)

func NewBackupCommand(c *config.Config) *cobra.Command {
	backupCmd := &cobra.Command{
		Use:   "backup",
		Short: "Back up the dashboards from grafana to a git repository.",
		Long:  "Back up the dashboards from grafana to a git repository.",
		Run: func(cmd *cobra.Command, _ []string) {
			if err := backup(cmd.Context(), c); err != nil {
				log.Fatal().Err(err).Send()
			}
		},
		PreRun: func(cmd *cobra.Command, _ []string) {
			errs := c.Validate()
			for _, err := range errs {
				log.Error().Err(err).Send()
			}

			if len(errs) > 0 {
				if err := cmd.Help(); err != nil {
					log.Error().Err(err).Send()
				}
				os.Exit(1)
			}
		},
	}

	backupCmd.PersistentFlags().BoolVar(&c.ForceCommits, "force", false, "Force git commits / ignore existence check")
	backupCmd.PersistentFlags().StringVar(&c.GitEmail, "git-email", "", "Git email address")
	backupCmd.PersistentFlags().StringVar(&c.GPGKey, "signing-key", "", "Path to the GPG signing key")

	return backupCmd
}

func backup(ctx context.Context, cfg *config.Config) error {
	client := grafanabackuper.NewClient(
		grafanabackuper.WithZerologLogger(cfg.Logger),
	)

	if err := client.GetSigner(cfg); err != nil {
		return err
	}

	if err := client.Prepare(ctx, cfg); err != nil {
		return err
	}

	return client.Backup.Start(ctx, cfg)
}