package core

import (
	"encoding/json"
	"fmt"
	"reflect"
)

// AssertJSONEqual compara dos payloads JSON por igualdad semantica.
// Retorna (true, "") si son equivalentes, o (false, diff) con una descripcion
// legible de la diferencia. No es sensible al orden de las claves en objetos.
func AssertJSONEqual(expected, actual []byte) (bool, string) {
	var expVal, actVal any

	if err := json.Unmarshal(expected, &expVal); err != nil {
		return false, fmt.Sprintf("expected JSON invalido: %v", err)
	}
	if err := json.Unmarshal(actual, &actVal); err != nil {
		return false, fmt.Sprintf("actual JSON invalido: %v", err)
	}

	if reflect.DeepEqual(expVal, actVal) {
		return true, ""
	}

	expPretty, _ := json.MarshalIndent(expVal, "", "  ")
	actPretty, _ := json.MarshalIndent(actVal, "", "  ")
	diff := fmt.Sprintf("expected:\n%s\n\nactual:\n%s", string(expPretty), string(actPretty))
	return false, diff
}
