package htmx

import "net/http"

type HTMX struct {
	w http.ResponseWriter
	r *http.Request
}

func New(w http.ResponseWriter, r *http.Request) *HTMX {
	return &HTMX{
		w: w,
		r: r,
	}
}

//
// Request header methods
//

// True when the request is an HTMX request
func (h *HTMX) IsHtmxRequest() bool {
	return h.r.Header.Get("HX-Request") == "true"
}

// Indicates that the request is via an element using hx-boost
func (h *HTMX) IsBoosted() bool {
	return h.r.Header.Get("HX-Boosted") == "true"
}

// The current URL of the browser
func (h *HTMX) CurrentUrl() string {
	return h.r.Header.Get("HX-Current-URL")
}

// If the request is for history restoration after a miss in the local history cache
func (h *HTMX) IsHistoryRestore() bool {
	return h.r.Header.Get("HX-History-Restore") == "true"
}

// The id of the element that triggered the request
func (h *HTMX) TriggerId() string {
	return h.r.Header.Get("HX-Trigger")
}

// The name of the element that triggered the request
func (h *HTMX) TriggerName() string {
	return h.r.Header.Get("HX-Trigger-Name")
}

// The id of the target element
func (h *HTMX) TargetId() string {
	return h.r.Header.Get("HX-Target")
}

// The value entered by the user when prompted via hx-prompt
func (h *HTMX) Prompt() string {
	return h.r.Header.Get("HX-Prompt")
}

//
// Response header methods
//

// Pushe a new url into the history stack
func (h *HTMX) PushUrl(url string) {
	h.w.Header().Set("HX-Push", url)
}

// Trigger a client-side redirect to a new location
func (h *HTMX) RedirectTo(url string) {
	h.w.Header().Set("HX-Redirect", url)
}

// Triggers a client-side redirect to a new location that acts as a swap
func (h *HTMX) Location(url string) {
	h.w.Header().Set("Location", url)
}

// Replace the current URL in the location bar
func (h *HTMX) ReplaceUrl(url string) {
	h.w.Header().Set("HX-Replace-Url", url)
}

// Sets refresh to true causing the client side to do a full refresh of the page
func (h *HTMX) Refresh() {
	h.w.Header().Set("HX-Refresh", "true")
}

// Trigger client side events
func (h *HTMX) Trigger(name string) {
	h.w.Header().Set("HX-Trigger", name)
}

// Trigger client side events after the swap step
func (h *HTMX) TriggerAfterSwap(name string) {
	h.w.Header().Set("HX-Trigger-After-Swap", name)
}

// Trigger client side events after the settle step
func (h *HTMX) TriggerAfterSettle(name string) {
	h.w.Header().Set("HX-Trigger-After-Settle", name)
}

// Specify how the response will be swapped. See hx-swap for possible values
func (h *HTMX) Reswap(value string) {
	h.w.Header().Set("HX-Reswap", value)
}

// Update the target of the content update to a different element on the page
// Value should be a CSS selector.
func (h *HTMX) Retarget(value string) {
	h.w.Header().Set("HX-Retarget", value)
}

// Choose which part of the response is used to be swapped in. Overrides an existing hx-select on the triggering element.
// Value should be a CSS selector.
func (h *HTMX) Reselect(value string) {
	h.w.Header().Set("HX-Reselect", value)
}
