001package jmri.jmrix.lenz.messageformatters;
002
003import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
004import jmri.jmrix.Message;
005import jmri.jmrix.lenz.XNetConstants;
006import jmri.jmrix.lenz.XNetReply;
007import jmri.jmrix.lenz.XPressNetMessageFormatter;
008
009/**
010 * Format replies for XPressNet Command Station Stack Search Results.
011 *
012 * @author Paul Bender Copyright (C) 2025
013 */
014public class XNetStackSearchReplyFormatter implements XPressNetMessageFormatter {
015
016
017    @Override
018    public boolean handlesMessage(Message m) {
019        return m instanceof XNetReply &&
020                m.getElement(0) == XNetConstants.LOCO_INFO_RESPONSE &&
021                (m.getElement(1) == XNetConstants.LOCO_SEARCH_NO_RESULT ||
022                        m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_DH ||
023                        m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_MU ||
024                        m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_MU_BASE ||
025                        m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_N);
026    }
027
028    @SuppressFBWarnings(value = "BC_UNCONFIRMED_CAST", justification = "cast is checked in handlesMessage")
029    @Override
030    public String formatMessage(Message m) {
031        if(!handlesMessage(m)){
032            throw new IllegalArgumentException("Message not supported by this formatter");
033        }
034        XNetReply r = (XNetReply) m;
035        StringBuilder text = new StringBuilder(Bundle.getMessage("XNetReplyLocoLabel") + " ");
036        switch (r.getElement(1)) {
037            case XNetConstants.LOCO_SEARCH_RESPONSE_N:
038                text.append(Bundle.getMessage("XNetReplySearchNormalLabel")).append(" ");
039                text.append(r.getThrottleMsgAddr());
040                break;
041            case XNetConstants.LOCO_SEARCH_RESPONSE_DH:
042                text.append(Bundle.getMessage("XNetReplySearchDHLabel")).append(" ");
043                text.append(r.getThrottleMsgAddr());
044                break;
045            case XNetConstants.LOCO_SEARCH_RESPONSE_MU_BASE:
046                text.append(Bundle.getMessage("XNetReplySearchMUBaseLabel")).append(" ");
047                text.append(r.getThrottleMsgAddr());
048                break;
049            case XNetConstants.LOCO_SEARCH_RESPONSE_MU:
050                text.append(Bundle.getMessage("XNetReplySearchMULabel")).append(" ");
051                text.append(r.getThrottleMsgAddr());
052                break;
053            case XNetConstants.LOCO_SEARCH_NO_RESULT:
054                text.append(Bundle.getMessage("XNetReplySearchFailedLabel")).append(" ");
055                text.append(r.getThrottleMsgAddr());
056                break;
057            default:
058                // Should never happen
059                throw new IllegalArgumentException("Message not supported by this formatter");
060        }
061        return text.toString();
062    }
063
064}