package httpapi

import (
	"errors"
	"strings"

	"github.com/go-playground/validator/v10"
)

// BindErrorMessage maps Gin/validator bind errors to short, user-safe text (no struct keys or tags).
func BindErrorMessage(err error) string {
	if err == nil {
		return "Data tidak valid."
	}
	var ve validator.ValidationErrors
	if errors.As(err, &ve) {
		for _, fe := range ve {
			if m := fieldValidationMessage(fe.Field(), fe.Tag()); m != "" {
				return m
			}
		}
		return "Periksa data yang Anda masukkan."
	}
	raw := strings.TrimSpace(err.Error())
	if looksLikeValidatorDump(raw) {
		return "Periksa data yang Anda masukkan."
	}
	if raw == "" {
		return "Data tidak valid."
	}
	return raw
}

func fieldValidationMessage(field, tag string) string {
	switch field {
	case "Email":
		switch tag {
		case "required":
			return "Email wajib diisi."
		case "email":
			return "Format email tidak valid."
		}
	case "Password":
		switch tag {
		case "required":
			return "Password wajib diisi."
		case "min":
			return "Password minimal 8 karakter."
		}
	case "Name":
		if tag == "required" {
			return "Nama wajib diisi."
		}
	}
	return ""
}

func looksLikeValidatorDump(s string) bool {
	return strings.Contains(s, "Field validation for") ||
		strings.Contains(s, "Key: '") ||
		strings.Contains(s, "failed on the '")
}
