package admin

import (
	"net/http"

	"code.nonshy.com/nonshy/website/pkg/config"
	"code.nonshy.com/nonshy/website/pkg/session"
	"code.nonshy.com/nonshy/website/pkg/templates"
)

// Maintenance controller (/admin/maintenance)
func Maintenance() http.HandlerFunc {
	tmpl := templates.Must("admin/maintenance.html")
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Query parameters.
		var (
			intent = r.FormValue("intent")
		)

		currentUser, err := session.CurrentUser(r)
		if err != nil {
			session.FlashError(w, r, "Couldn't get your current user: %s", err)
		}

		_ = currentUser

		// POST event handlers.
		if r.Method == http.MethodPost {
			// Collect the form parameters.
			var (
				pauseSignup      = r.PostFormValue("signup") == "true"
				pauseLogin       = r.PostFormValue("login") == "true"
				pauseChat        = r.PostFormValue("chat") == "true"
				pauseInteraction = r.PostFormValue("interaction") == "true"
			)

			switch intent {
			case "everything", "nothing":
				pauseSignup = intent == "everything"
				pauseLogin = pauseSignup
				pauseChat = pauseSignup
				pauseInteraction = pauseSignup
				intent = "save"
				fallthrough
			case "save":
				// Update and save the site settings.
				config.Current.Maintenance.PauseSignup = pauseSignup
				config.Current.Maintenance.PauseLogin = pauseLogin
				config.Current.Maintenance.PauseChat = pauseChat
				config.Current.Maintenance.PauseInteraction = pauseInteraction
				if err := config.WriteSettings(); err != nil {
					session.FlashError(w, r, "Couldn't write settings.json: %s", err)
				} else {
					session.Flash(w, r, "Maintenance settings updated!")
				}
			default:
				session.FlashError(w, r, "Unsupported intent: %s", intent)
			}

			templates.Redirect(w, r.URL.Path)
			return
		}

		var vars = map[string]interface{}{
			"Intent": intent,
			"Maint":  config.Current.Maintenance,
		}
		if err := tmpl.Execute(w, r, vars); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
	})
}
