package manage

// csrf_helpers.go — Hilfsfunktionen für CSRF im manage-Package (K1).
//
// Das manage-Package darf httpapi nicht importieren (würde einen Import-Cycle erzeugen).
// Deshalb sind die minimalen CSRF-Hilfsfunktionen hier dupliziert.
// Die eigentliche CSRF-Middleware lebt in httpapi/csrf.go.

import (
	"crypto/rand"
	"encoding/hex"
	"net/http"
)

const (
	csrfCookieName = "morz_csrf"
	// CSRFFieldName ist der Name des versteckten Form-Felds mit dem CSRF-Token.
	// Wird in Templates als {{.CSRFToken}} eingebettet.
	CSRFFieldName  = "csrf_token"
)

// setCSRFCookie setzt (oder erneuert) den CSRF-Cookie und gibt das Token zurück.
// Wird von Handlern aufgerufen, die GET-Seiten mit Formularen rendern.
func setCSRFCookie(w http.ResponseWriter, r *http.Request, devMode bool) string {
	// Existierendes Token wiederverwenden.
	if c, err := r.Cookie(csrfCookieName); err == nil && c.Value != "" {
		return c.Value
	}
	buf := make([]byte, 32)
	if _, err := rand.Read(buf); err != nil {
		return ""
	}
	token := hex.EncodeToString(buf)
	http.SetCookie(w, &http.Cookie{
		Name:     csrfCookieName,
		Value:    token,
		Path:     "/",
		HttpOnly: false, // muss von JS nicht gelesen werden; Formulare nutzen das versteckte Feld
		Secure:   !devMode,
		SameSite: http.SameSiteLaxMode,
		MaxAge:   8 * 3600, // 8h
	})
	return token
}
