package hr.com.port.ips.eracun.provider.mer.dto.errors;

import hr.com.port.ips.eracun.provider.mer.dto.errors.MerAdvisedError;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * Parser MER v1.8 error payloada.
 * Očekivani oblik: { "traceId": "...", "message": "..." }
 * Ako payload nije JSON ili nema ta polja, vraća sirovu poruku.
 */
public final class MerErrors {
    private MerErrors() {}

    /** Primarno: parsiraj sirovi response body u MerAdvisedError. */
    public static MerAdvisedError parseFromRaw(String raw) {
        MerAdvisedError ae = new MerAdvisedError();
        if (raw == null || raw.trim().isEmpty()) {
            ae.setMessage("Empty error payload");
            return ae;
        }
        try {
            JsonObject obj = JsonParser.parseString(raw).getAsJsonObject();
            return parseFromJson(obj);
        } catch (Exception ignore) {
            // nije JSON → vrati sirovi tekst kao poruku
            ae.setMessage(raw);
            return ae;
        }
    }

    /** Alternativa: ako već imaš JsonObject. */
    public static MerAdvisedError parseFromJson(JsonObject obj) {
        MerAdvisedError ae = new MerAdvisedError();
        if (obj == null) {
            ae.setMessage("Empty error payload");
            return ae;
        }
        String message = getString(obj, "message");
        String traceId = getString(obj, "traceId");

        if (message != null && !message.trim().isEmpty()) {
            ae.setMessage(message.trim());
        }
        if (traceId != null && !traceId.trim().isEmpty()) {
            ae.setTraceId(traceId.trim());
        }

        // Ako nema standardnih polja, vrati cijeli JSON kao tekst
        if (ae.getMessage() == null || ae.getMessage().trim().isEmpty()) {
            ae.setMessage(obj.toString());
        }
        return ae;
    }

    private static String getString(JsonObject o, String key) {
        try {
            if (o.has(key) && !o.get(key).isJsonNull()) {
                return o.get(key).getAsString();
            }
        } catch (Exception ignore) { /* noop */ }
        return null;
    }
}