package render

import (
	"net/http/httptest"
	"net/url"
	"testing"
)

func TestShouldRestoreAppBuscaState(t *testing.T) {
	q := url.Values{"welcome": {"1"}}
	if !ShouldRestoreAppBuscaState(q) {
		t.Fatal("expected restore for welcome only")
	}
	q = url.Values{"uf": {"SP"}}
	if ShouldRestoreAppBuscaState(q) {
		t.Fatal("expected no restore when filters present")
	}
	q = url.Values{"clear": {"1"}}
	if ShouldRestoreAppBuscaState(q) {
		t.Fatal("expected no restore on clear")
	}
}

func TestShouldExecuteAppBuscaSearch(t *testing.T) {
	if ShouldExecuteAppBuscaSearch(url.Values{}) {
		t.Fatal("empty query should not search")
	}
	if !ShouldExecuteAppBuscaSearch(url.Values{"busca_submitted": {"1"}, "uf": {"SP"}}) {
		t.Fatal("submitted query should search")
	}
	if !ShouldExecuteAppBuscaSearch(url.Values{"uf": {"SP"}, "page": {"2"}}) {
		t.Fatal("URL with filters should search without busca_submitted")
	}
	if ShouldExecuteAppBuscaSearch(url.Values{"clear": {"1"}, "busca_submitted": {"1"}}) {
		t.Fatal("clear should not search")
	}
}

func TestHydrateAppBuscaQuery(t *testing.T) {
	w := httptest.NewRecorder()
	SaveAppBuscaState(w, url.Values{
		"busca_submitted": {"1"},
		"uf":              {"RJ"},
		"page":            {"2"},
	})
	req := httptest.NewRequest("GET", "/app/busca", nil)
	req.AddCookie(w.Result().Cookies()[0])
	got := HydrateAppBuscaQuery(req, url.Values{})
	if got.Get("uf") != "RJ" {
		t.Fatalf("uf: %v", got)
	}
	if got.Get("busca_submitted") != "" {
		t.Fatal("hydrate must not restore busca_submitted")
	}
	if !ShouldExecuteAppBuscaSearch(got) {
		t.Fatal("hydrated filters should execute search on SSR")
	}
}

func TestSaveAndRestoreAppBuscaState(t *testing.T) {
	w := httptest.NewRecorder()
	q := url.Values{
		"busca_submitted": {"1"},
		"uf":              {"RJ"},
		"page":            {"3"},
		"ok":              {"export"},
	}
	SaveAppBuscaState(w, q)
	if len(w.Result().Cookies()) != 1 {
		t.Fatalf("expected cookie, got %d", len(w.Result().Cookies()))
	}
	req := httptest.NewRequest("GET", "/app/busca?ok=export", nil)
	req.AddCookie(w.Result().Cookies()[0])
	got := RestoreAppBuscaURL(req, q)
	wantPrefix := "/app/busca?"
	if got == "" || got[:len(wantPrefix)] != wantPrefix {
		t.Fatalf("unexpected restore url: %q", got)
	}
	parsed, _ := url.Parse(got)
	if parsed.Query().Get("uf") != "RJ" {
		t.Fatalf("uf missing: %v", parsed.Query())
	}
	if parsed.Query().Get("page") != "3" {
		t.Fatalf("page missing: %v", parsed.Query())
	}
	if parsed.Query().Get("ok") != "export" {
		t.Fatalf("flash ok missing: %v", parsed.Query())
	}
}
