// Copyright 2023 Harran Ali <harran.m@gmail.com>. All rights reserved.
// Copyright (c) 2024 Zeni Kim <zenik@smarteching.com>
// Use of this source code is governed by MIT-style
// license that can be found in the LICENSE file.

package main

import (
	"embed"
	"log"
	"os"
	"path"

	"git.smarteching.com/goffee/core"
	"git.smarteching.com/goffee/core/env"
	"git.smarteching.com/goffee/core/logger"
	"git.smarteching.com/jacs/goffeetabler/config"
	"github.com/joho/godotenv"
	"github.com/julienschmidt/httprouter"
)

//go:embed all:storage/templates
var resources embed.FS

// The main function
func main() {
	app := core.New()
	basePath, err := os.Getwd()
	runMode := "dev"
	if len(os.Args) > 1 {
		if os.Args[1] == "prod" || os.Args[1] == "dev" {
			runMode = os.Args[1]
		}
	}
	if err != nil {
		log.Fatal("error getting current working dir")
	}
	app.SetBasePath(basePath)
	app.SetRunMode(runMode)
	app.MakeDirs("logs", "storage", "storage/sqlite", "tls")
	// Handle the reading of the .env file
	if config.GetEnvFileConfig().UseDotEnvFile {
		envfile := ".env-dev"
		if runMode == "prod" {
			envfile = ".env"
		}
		envVars, err := godotenv.Read(envfile)
		if err != nil {
			log.Fatal("Error loading .env file")
		}
		env.SetEnvVars(envVars)
	}
	// Handle the logs
	app.SetLogsDriver(&logger.LogFileDriver{
		FilePath: path.Join(basePath, "logs/app.log"),
	})
	app.SetRequestConfig(config.GetRequestConfig())
	app.SetGormConfig(config.GetGormConfig())
	app.SetCacheConfig(config.GetCacheConfig())
	app.Bootstrap()
	app.RegisterTemplates(resources)
	registerGlobalHooks()
	registerRoutes()
	registerEvents()
	if config.GetQueueConfig().EnableQueue == true {
		registerQueues()
	}
	if config.GetGormConfig().EnableGorm == true {
		RunAutoMigrations()
	}
	app.Run(httprouter.New())
}
