package main

/* ---------------------------------------------------------------- *
 * IMPORTS
 * ---------------------------------------------------------------- */

import (
	"embed"
	"os"

	"ads/internal/core/logging"
	"ads/internal/setup"
	"ads/internal/setup/cli"
	"ads/internal/types"

	endpoints_print "ads/internal/endpoints/print"
	endpoints_run "ads/internal/endpoints/run"
)

/* ---------------------------------------------------------------- *
 * GLOBAL VARIABLES
 * ---------------------------------------------------------------- */

var (
	// !!! NOTE: do not remove the following "comment", as it is a preprocessing instruction !!!
	//go:embed assets/*
	res    embed.FS
	assets = map[string]string{
		"appconfig": "assets/config.yml",
		"version":   "assets/VERSION",
		"logo":      "assets/LOGO",
		"help":      "assets/HELP",
	}
)

/* ---------------------------------------------------------------- *
 * METHOD main
 * ---------------------------------------------------------------- */

func main() {
	var err error
	var arguments *types.CliArguments
	var (
		cmdMissing bool
		showChecks bool
	)

	// assets festlegen
	setup.Res = res
	setup.Assets = assets

	// cli arguments parsen
	arguments, err = cli.ParseCli(os.Args)
	cmdMissing = cli.ParseCliCommandMissing(err)

	// initialisiere basic optionen wie Logging
	showChecks = false
	if err == nil {
		if !(arguments.ModeRun.Happened() && arguments.InteractiveMode()) {
			logging.SetQuietMode(arguments.QuietModeOn())
			logging.SetDebugMode(arguments.DebugModeOn())
		}
		logging.SetAnsiMode(arguments.ShowColour())
		showChecks = arguments.ShowChecks()
	}

	// app config (intern) intialisieren
	err = setup.AppConfigInitialise()
	setup.SetAppConfigPerformChecks(showChecks)

	if err == nil {
		if arguments.ModeVersion.Happened() {
			endpoints_print.Version()
			return
		} else if arguments.ModeRun.Happened() {
			if arguments.InteractiveMode() {
				endpoints_run.RunInteractive()
			} else {
				err = endpoints_run.RunNonInteractive(arguments.GetConfigFile())
				if err != nil {
					logging.Fatal(err)
				}
			}
			return
		} else if arguments.ModeHelp.Happened() {
			endpoints_print.Help()
			return
		} else {
			endpoints_run.RunInteractive()
		}
	} else if cmdMissing {
		endpoints_run.RunInteractive()
	} else {
		logging.Fatal(err)
	}
}