package handlers

import (
	"encoding/json"
	"net/http"
	"strconv"
)

func writeJSON(w http.ResponseWriter, status int, v any) {
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	w.Header().Set("Cache-Control", "public, max-age=300")
	w.WriteHeader(status)
	_ = json.NewEncoder(w).Encode(v)
}

func (h *Handler) APIFiltrosUFs(w http.ResponseWriter, r *http.Request) {
	meta, err := h.leads.Filtros(r.Context())
	if err != nil {
		http.Error(w, "Não foi possível carregar UFs.", http.StatusBadGateway)
		return
	}
	writeJSON(w, http.StatusOK, map[string]any{"items": h.leads.UFOptions(meta)})
}

func (h *Handler) APIFiltrosMunicipios(w http.ResponseWriter, r *http.Request) {
	uf := r.URL.Query().Get("uf")
	if uf == "" {
		http.Error(w, "Parâmetro uf é obrigatório.", http.StatusBadRequest)
		return
	}
	out, err := h.leads.Municipios(r.Context(), uf, r.URL.Query().Get("q"), r.URL.Query().Get("cursor"), searchPageSize(r))
	if err != nil {
		http.Error(w, "Não foi possível carregar municípios.", http.StatusBadGateway)
		return
	}
	writeJSON(w, http.StatusOK, out)
}

func (h *Handler) APIFiltrosCNAEs(w http.ResponseWriter, r *http.Request) {
	out, err := h.leads.CNAEs(r.Context(), r.URL.Query().Get("q"), r.URL.Query().Get("cursor"), searchPageSize(r))
	if err != nil {
		http.Error(w, "Não foi possível carregar CNAEs.", http.StatusBadGateway)
		return
	}
	writeJSON(w, http.StatusOK, out)
}

func searchPageSize(r *http.Request) int {
	if r.URL.Query().Get("q") == "" {
		return 0
	}
	pageSize := 100
	if ps := r.URL.Query().Get("page_size"); ps != "" {
		if n, err := strconv.Atoi(ps); err == nil && n > 0 && n <= 200 {
			pageSize = n
		}
	}
	return pageSize
}
