package cli

import (
	"github.com/rs/zerolog/log"
	"github.com/thomiceli/opengist/internal/config"
	"github.com/thomiceli/opengist/internal/db"
	"github.com/thomiceli/opengist/internal/hooks"
	"github.com/urfave/cli/v2"
	"io"
	"os"
	"path/filepath"
)

var CmdHook = cli.Command{
	Name:  "hook",
	Usage: "Run Git server hooks, used and should only be called by Opengist itself",
	Subcommands: []*cli.Command{
		&CmdHookPreReceive,
		&CmdHookPostReceive,
	},
}

var CmdHookPreReceive = cli.Command{
	Name:  "pre-receive",
	Usage: "Run Git server pre-receive hook for a repository",
	Action: func(ctx *cli.Context) error {
		initialize(ctx)
		if err := hooks.PreReceive(os.Stdin, os.Stdout, os.Stderr); err != nil {
			os.Exit(1)
		}
		return nil
	},
}

var CmdHookPostReceive = cli.Command{
	Name:  "post-receive",
	Usage: "Run Git server post-receive hook for a repository",
	Action: func(ctx *cli.Context) error {
		initialize(ctx)
		if err := hooks.PostReceive(os.Stdin, os.Stdout, os.Stderr); err != nil {
			os.Exit(1)
		}
		return nil
	},
}

func initialize(ctx *cli.Context) {
	if err := config.InitConfig(ctx.String("config"), io.Discard); err != nil {
		panic(err)
	}
	config.InitLog()

	if err := db.Setup(filepath.Join(config.GetHomeDir(), config.C.DBFilename), false); err != nil {
		log.Fatal().Err(err).Msg("Failed to initialize database in hooks")
	}
}