package main

import (
	"flag"
	"os"
	"os/signal"
	"syscall"

	"git.canopymc.net/Etzelia/stonebot/database"
	"git.canopymc.net/Etzelia/stonebot/discord"

	"github.com/peterbourgon/ff/v3"
	"github.com/peterbourgon/ff/v3/fftoml"
	"go.jolheiser.com/beaver"
	"go.jolheiser.com/beaver/color"
)

func main() {
	fs := flag.NewFlagSet("stonebot", flag.ExitOnError)
	fs.String("config", "stonebot.toml", "Path to config file")
	verboseFlag := fs.Bool("verbose", false, "Verbose logging")
	tokenFlag := fs.String("token", "", "Discord bot token")
	prefixFlag := fs.String("prefix", "!", "Discord bot prefix")
	dbFlag := fs.String("db", "stonebot.db", "Path to DB")
	if err := ff.Parse(fs, os.Args[1:],
		ff.WithEnvVarPrefix("STONEBOT"),
		ff.WithConfigFileFlag("config"),
		ff.WithConfigFileParser(fftoml.Parser),
		ff.WithAllowMissingConfigFile(true),
	); err != nil {
		beaver.Fatal(err)
	}

	beaver.Console.Format = beaver.FormatOptions{
		TimePrefix:  true,
		StackPrefix: true,
		StackLimit:  15,
		LevelPrefix: true,
		LevelColor:  true,
	}
	color.Fatal = color.Error

	if *tokenFlag == "" {
		beaver.Fatal("discord token is required")
	}

	if *verboseFlag {
		beaver.Console.Level = beaver.DEBUG
	}

	db, err := database.New(*dbFlag)
	if err != nil {
		beaver.Fatalf("could not connect to database: %v", err)
	}
	defer db.Close()

	bot, err := discord.New(*tokenFlag, *prefixFlag, db)
	if err != nil {
		beaver.Fatalf("could not run bot: %v", err)
	}
	defer bot.Close()
	if err := bot.Open(); err != nil {
		beaver.Fatalf("could not open bot connection: %v", err)
	}

	beaver.Info("Bot is now running.  Press CTRL-C to exit.")
	sc := make(chan os.Signal, 1)
	signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
	<-sc
}
