package com.jscape.inet.terminal.commands;

import com.jscape.inet.terminal.Terminal;
import com.jscape.inet.terminal.VT52Set;

/**
 * RM -- Reset Mode.
 * Resets one or more VT100 modes as specified by each selective parameter in
 * the parameter string. Each mode to be reset is specified by a separate
 * parameter.
 */
public class RMCommand
        implements ControlCommand {

    public static final String CANONICAL_FORM = "\033[l";
    private static final RMCommand INSTANCE = new RMCommand();

    //----------------------------------------------------------------------------

    /**
     * Returns one and only one instance of this type.
     *
     * @return one and only one instance of this type.
     */
    public static RMCommand getInstance() {
        return INSTANCE;
    }

    //----------------------------------------------------------------------------

    /**
     * Private constructor to prevent uncontrolled creation.
     */
    private RMCommand() {
    }

    //----------------------------------------------------------------------------

    /**
     * Executes command giving parameters and <code>Terminal</code> object.
     *
     * @param params   array of <code>int</code> command parametrs.
     * @param terminal target <code>Terminal</code> object.
     */
    public void execute(int[] params, Terminal terminal) {
        if (params != null && params.length > 0) {
            for (int i = 0; i < params.length; ++i) {
                resetMode(params[i], terminal);
            }
        }
    }

    //----------------------------------------------------------------------------

    /**
     * Sends command to remote host.
     *
     * @param params   command parameters.
     * @param terminal target <code>Terminal</code> object to send command.
     */
    public void send(int[] params, Terminal terminal) {
        if (params == null || params.length == 0) {
            terminal.send(CANONICAL_FORM);
        } else {
            StringBuffer b = new StringBuffer("\033[?");

            for (int i = 0; i < params.length; ++i) {
                b.append(params[i]);
                if (i < (params.length - 1)) {
                    b.append(';');
                }
            }

            b.append('l');
            terminal.send(b.toString());
        }
    }

    //----------------------------------------------------------------------------
    private void resetMode(int code, Terminal terminal) {
        switch (code) {
            case 2:
                terminal.setCommandSet(VT52Set.getInstance());
                break;
            case 6:
                terminal.getScreen().setOriginMode(false);
                break;
            case 7:
                terminal.setAutoWrapMode(false);
                break;
            case 20:
                terminal.setLNMMode(false);
                break;
            default:
                break;
        }
    }

}
