package middleware

import (
	"net/http"

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

var tmplMaint = templates.Must("errors/maintenance.html")

// MaintenanceMode check at the middleware level, e.g. to block
// LoginRequired and CertificationRequired if site-wide interaction
// is currently on hold. Returns true if handled.
func MaintenanceMode(currentUser *models.User, w http.ResponseWriter, r *http.Request) bool {
	// Is the site under a Maintenance Mode restriction?
	if config.Current.Maintenance.PauseInteraction && !currentUser.IsAdmin {
		var vars = map[string]interface{}{
			"Reason": "interaction",
		}
		if err := tmplMaint.Execute(w, r, vars); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
		return true
	}

	return false
}

// SignupMaintenance may handle maintenance mode requests for signup gating.
func SignupMaintenance(w http.ResponseWriter, r *http.Request) bool {
	if config.Current.Maintenance.PauseSignup {
		var vars = map[string]interface{}{
			"Reason": "signup",
		}
		if err := tmplMaint.Execute(w, r, vars); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
		return true
	}
	return false
}

// LoginMaintenance may handle maintenance mode requests for login gating.
func LoginMaintenance(currentUser *models.User, w http.ResponseWriter, r *http.Request) bool {
	if config.Current.Maintenance.PauseLogin && !currentUser.IsAdmin {
		var vars = map[string]interface{}{
			"Reason": "login",
		}
		if err := tmplMaint.Execute(w, r, vars); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
		return true
	}
	return false
}

// ChatMaintenance may handle maintenance mode requests for chat room gating.
func ChatMaintenance(currentUser *models.User, w http.ResponseWriter, r *http.Request) bool {
	if config.Current.Maintenance.PauseChat && !currentUser.IsAdmin {
		var vars = map[string]interface{}{
			"Reason": "chat",
		}
		if err := tmplMaint.Execute(w, r, vars); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
		return true
	}
	return false
}
