package routes

import (
	"log/slog"
	"net/http"

	"git.codemonkeysoftware.net/b/peachy-go"
	"git.codemonkeysoftware.net/b/peachy-go/desktop/components"
	"git.codemonkeysoftware.net/b/peachy-go/desktop/fields"
	"git.codemonkeysoftware.net/b/peachy-go/desktop/pages"
	"github.com/go-chi/chi/v5"
	"github.com/go-chi/chi/v5/middleware"
	"github.com/go-chi/httplog/v2"
)

/*
Create a new chi router, configure it and return it.
*/
func NewChiRouter(port string, db *peachy.DB) *chi.Mux {

	r := chi.NewRouter()

	logger := httplog.NewLogger("app-logger", httplog.Options{
		LogLevel: slog.LevelInfo,
		Concise:  true,
	})

	// Use the logger and recoverer middleware.
	r.Use(httplog.RequestLogger(logger))
	r.Use(middleware.Recoverer)

	/*
		// ULTRA IMPORTANT : This middleware is used to prevent caching of the pages.
		// Sometimes, HX requests may be cached by the browser, which may cause unexpected behavior.
		r.Use(func(next http.Handler) http.Handler {
			return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
				w.Header().Set("Cache-Control", "no-store")
				next.ServeHTTP(w, r)
			})
		})
	*/

	r.Handle("/static/*", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

	r.Get("/", func(w http.ResponseWriter, r *http.Request) {
		HXRender(w, r, pages.Splash)
	})

	r.Get("/site", func(w http.ResponseWriter, r *http.Request) {
		page, err := pages.HomePage(db)
		if err != nil {
			logger.Error("internal error", "path", r.URL.Path, "error", err)
			w.WriteHeader(http.StatusInternalServerError)
			return
		}
		HXRender(w, r, page)
	})

	r.Patch("/site", func(w http.ResponseWriter, r *http.Request) {
		r.ParseForm()
		if r.Form.Has(fields.SiteName) {
			err := db.SetSiteName(r.Form.Get(fields.SiteName))
			if err != nil {
				logger.Error("internal error", "path", r.URL.Path, "error", err)
				w.WriteHeader(http.StatusInternalServerError)
				return
			}
		}
		w.WriteHeader(http.StatusOK)
	})

	r.Get("/hello", func(w http.ResponseWriter, r *http.Request) {
		HXRender(w, r, components.HelloWorld)
	})

	go http.ListenAndServe(":"+port, r)

	return r
}
