package render

import (
	"net/http"
	"net/url"
)

const AppBuscaStateCookie = "leadb2b_app_busca"

var appBuscaStateSkip = map[string]bool{
	"welcome": true,
	"error":   true,
	"ok":      true,
	"clear":   true,
}

func ShouldRestoreAppBuscaState(q url.Values) bool {
	if q.Get("clear") == "1" {
		return false
	}
	for k := range q {
		if !appBuscaStateSkip[k] {
			return false
		}
	}
	return true
}

// ShouldExecuteAppBuscaSearch indica se a listagem na API deve rodar.
// Inclui busca explícita (busca_submitted), URL com filtros (paginação/favorito)
// e filtros restaurados do cookie em /app/busca.
func ShouldExecuteAppBuscaSearch(q url.Values) bool {
	if q.Get("clear") == "1" {
		return false
	}
	if q.Get("busca_submitted") == "1" {
		return true
	}
	return queryHasUserFilters(q)
}

func ShouldSaveAppBuscaState(q url.Values) bool {
	if q.Get("busca_submitted") != "1" {
		return false
	}
	for k := range q {
		if !appBuscaStateSkip[k] {
			return true
		}
	}
	return false
}

func queryHasUserFilters(q url.Values) bool {
	for k := range q {
		if appBuscaStateSkip[k] || k == "busca_submitted" {
			continue
		}
		return true
	}
	return false
}

// HydrateAppBuscaQuery repõe filtros salvos no cookie sem reexecutar a busca automaticamente.
func HydrateAppBuscaQuery(r *http.Request, q url.Values) url.Values {
	if q.Get("clear") == "1" || queryHasUserFilters(q) {
		return q
	}
	c, err := r.Cookie(AppBuscaStateCookie)
	if err != nil || c.Value == "" {
		return q
	}
	saved, err := url.ParseQuery(c.Value)
	if err != nil || len(saved) == 0 {
		return q
	}
	delete(saved, "busca_submitted")
	out := url.Values{}
	for k, vals := range saved {
		for _, v := range vals {
			out.Add(k, v)
		}
	}
	for k, vals := range q {
		if appBuscaStateSkip[k] && len(vals) > 0 {
			out.Set(k, vals[0])
		}
	}
	return out
}

func CloneAppBuscaQuery(q url.Values) url.Values {
	out := url.Values{}
	for k, vals := range q {
		if appBuscaStateSkip[k] {
			continue
		}
		for _, v := range vals {
			out.Add(k, v)
		}
	}
	return out
}

func SaveAppBuscaState(w http.ResponseWriter, q url.Values) {
	if !ShouldSaveAppBuscaState(q) {
		return
	}
	state := CloneAppBuscaQuery(q).Encode()
	if state == "" {
		return
	}
	http.SetCookie(w, &http.Cookie{
		Name:     AppBuscaStateCookie,
		Value:    state,
		Path:     "/app/busca",
		MaxAge:   30 * 24 * 3600,
		HttpOnly: true,
		SameSite: http.SameSiteLaxMode,
	})
}

func ClearAppBuscaState(w http.ResponseWriter) {
	http.SetCookie(w, &http.Cookie{
		Name:     AppBuscaStateCookie,
		Value:    "",
		Path:     "/app/busca",
		MaxAge:   -1,
		HttpOnly: true,
		SameSite: http.SameSiteLaxMode,
	})
}

func RestoreAppBuscaURL(r *http.Request, flash url.Values) string {
	c, err := r.Cookie(AppBuscaStateCookie)
	if err != nil || c.Value == "" {
		return ""
	}
	q, err := url.ParseQuery(c.Value)
	if err != nil || len(q) == 0 {
		return ""
	}
	for k, vals := range flash {
		if appBuscaStateSkip[k] && len(vals) > 0 {
			q.Set(k, vals[0])
		}
	}
	return "/app/busca?" + q.Encode()
}
