package handlers

import (
	"net/http"
	"net/url"

	"leadb2b.org/internal/api"
)

func productErrorQuery(err error) string {
	apiErr, ok := err.(*api.APIError)
	if !ok || apiErr.Code == "" {
		return "unknown"
	}
	return apiErr.Code
}

func ProductErrorMessage(code string) string {
	switch code {
	case "ACTIVE_LIMIT_REACHED":
		return "Limite de leads ativos atingido. Finalize ou arquive leads no kanban para liberar espaço."
	case "ALREADY_WORKING":
		return "Este CNPJ já está no seu funil."
	case "DAILY_ADD_LIMIT":
		return "Limite diário de novos leads atingido. Tente amanhã ou faça upgrade do plano."
	case "PLAN_INACTIVE":
		return "Plano inativo ou expirado. Acesse Meu plano ou entre em contato."
	case "FEATURE_DISABLED":
		return "Recurso não disponível no seu plano atual."
	case "EXPORT_LIMIT":
		return "Limite diário de exportações atingido (máx. 30/dia no Pro)."
	case "NOT_IN_FUNNEL":
		return "Trabalhe este lead antes de acessar contatos ou detalhes completos."
	case "PORTAL_KEY_NOT_ALLOWED":
		return "Sessão inválida. Faça login novamente."
	case "RATE_LIMIT":
		return "Muitas requisições. Aguarde um momento e tente de novo."
	case "INVALID_CNPJ":
		return "CNPJ inválido. Verifique o cadastro e tente novamente."
	case "NOT_FOUND", "CNPJ_NOT_FOUND", "LEAD_NOT_FOUND":
		return "Empresa não encontrada na base consultada."
	default:
		return "Não foi possível concluir a ação. Tente novamente."
	}
}

func formatAPIError(err error) string {
	apiErr, ok := err.(*api.APIError)
	if !ok {
		return ProductErrorMessage("unknown")
	}
	if msg := ProductErrorMessage(apiErr.Code); msg != ProductErrorMessage("unknown") {
		return msg
	}
	if apiErr.Message != "" {
		return apiErr.Message
	}
	return ProductErrorMessage("unknown")
}

func isAppAjax(r *http.Request) bool {
	return r.Header.Get("X-Requested-With") == "XMLHttpRequest"
}

func redirectWithProductError(w http.ResponseWriter, r *http.Request, basePath string, err error) {
	q := url.Values{}
	q.Set("error", productErrorQuery(err))
	http.Redirect(w, r, basePath+"?"+q.Encode(), http.StatusFound)
}
