package main

import (
	"fmt"
	"log"
	"net/http"
	"os"

	"github.com/pocketbase/pocketbase"

	"github.com/pocketbase/pocketbase/apis"
	"github.com/pocketbase/pocketbase/core"
	"github.com/pocketbase/pocketbase/plugins/migratecmd"

	linkpb "clio/internal/link/pocketbase"
	_ "clio/migrations"
)

func main() {
	app := pocketbase.New()

	migratecmd.MustRegister(app, app.RootCmd, migratecmd.Config{
		Automigrate: true,
		Dir:         "./migrations",
	})

	app.OnServe().BindFunc(func(se *core.ServeEvent) error {
		// Setup link processor
		_, api := linkpb.Setup(app)

		// API endpoint for phase advance
		se.Router.POST("/api/custom/links/{id}/phase/advance", func(e *core.RequestEvent) error {
			linkID := e.Request.PathValue("id")

			app.Logger().Debug(fmt.Sprintf("[PHASE] Advancing link %s", linkID))

			result, err := api.Advance(linkID)
			if err != nil {
				app.Logger().Debug(fmt.Sprintf("[PHASE] Error: %v", err))
				return e.JSON(http.StatusBadRequest, map[string]string{
					"message": err.Error(),
				})
			}

			app.Logger().Debug("[PHASE] Advance success")
			return e.JSON(http.StatusOK, result)
		})

		// API endpoint for phase rerun
		se.Router.POST("/api/custom/links/{id}/phase/rerun", func(e *core.RequestEvent) error {
			linkID := e.Request.PathValue("id")

			app.Logger().Debug(fmt.Sprintf("[PHASE] Rerunning last phase for link %s", linkID))

			result, err := api.Rerun(linkID)
			if err != nil {
				app.Logger().Debug(fmt.Sprintf("[PHASE] Error: %v", err))
				return e.JSON(http.StatusBadRequest, map[string]string{
					"message": err.Error(),
				})
			}

			app.Logger().Debug("[PHASE] Rerun success")
			return e.JSON(http.StatusOK, result)
		})

		// Serve static files from pb_public directory
		se.Router.GET("/{path...}", apis.Static(os.DirFS("./pb_public"), false))

		return se.Next()
	})

	// Cleanup sessions on shutdown
	app.OnTerminate().BindFunc(func(te *core.TerminateEvent) error {
		return te.Next()
	})

	if err := app.Start(); err != nil {
		log.Fatal(err)
	}
}
