package main

import (
	"encoding/json"
	"fmt"
	"ttime/internal/config"
	"ttime/internal/database"
	"ttime/internal/handlers"

	"github.com/gofiber/fiber/v2"
	_ "github.com/mattn/go-sqlite3"

	jwtware "github.com/gofiber/contrib/jwt"
)

func main() {
	conf, err := config.ReadConfigFromFile("config.toml")
	if err != nil {
		conf = config.NewConfig()
		_ = conf.WriteConfigToFile("config.toml")
	}

	// Pretty print the current config
	str, _ := json.MarshalIndent(conf, "", "  ")
	fmt.Println(string(str))

	// Connect to the database
	db := database.DbConnect(conf.DbPath)
	// Get our global state
	gs := handlers.NewGlobalState(db)
	// Create the server
	server := fiber.New()

	// Mount our static files (Beware of the security implications of this!)
	// This will likely be replaced by an embedded filesystem in the future
	server.Static("/", "./static")

	// Register our unprotected routes
	server.Post("/api/register", gs.Register)

	// Register handlers for example button count
	server.Get("/api/button", gs.GetButtonCount)
	server.Post("/api/button", gs.IncrementButtonCount)

	server.Post("/api/login", gs.Login)

	// Every route from here on will require a valid JWT
	server.Use(jwtware.New(jwtware.Config{
		SigningKey: jwtware.SigningKey{Key: []byte("secret")},
	}))

	server.Post("/api/loginrenew", gs.LoginRenew)
	server.Delete("/api/userdelete", gs.UserDelete) // Perhaps just use POST to avoid headaches

	// Announce the port we are listening on and start the server
	err = server.Listen(fmt.Sprintf(":%d", conf.Port))
	if err != nil {
		fmt.Println("Error starting server: ", err)
	}
}