/*
 * Copyright (C)2009 - SSHJ Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.schmizz.sshj.common;

/** SSH message identifiers */
public enum Message {

    UNKNOWN(0),
    DISCONNECT(1),
    IGNORE(2),
    UNIMPLEMENTED(3),
    DEBUG(4),
    SERVICE_REQUEST(5),
    SERVICE_ACCEPT(6),
    EXT_INFO(7),
    KEXINIT(20),
    NEWKEYS(21),

    KEXDH_INIT(30),

    /** { KEXDH_REPLY, KEXDH_GEX_GROUP, SSH_MSG_KEX_ECDH_REPLY } */
    KEXDH_31(31),

    KEX_DH_GEX_INIT(32),
    KEX_DH_GEX_REPLY(33),
    KEX_DH_GEX_REQUEST(34),

    USERAUTH_REQUEST(50),
    USERAUTH_FAILURE(51),
    USERAUTH_SUCCESS(52),
    USERAUTH_BANNER(53),

    /** { USERAUTH_PASSWD_CHANGREQ, USERAUTH_PK_OK, USERAUTH_INFO_REQUEST } */
    USERAUTH_60(60),
    USERAUTH_INFO_RESPONSE(61),

    USERAUTH_GSSAPI_EXCHANGE_COMPLETE(63),
    USERAUTH_GSSAPI_MIC(66),

    GLOBAL_REQUEST(80),
    REQUEST_SUCCESS(81),
    REQUEST_FAILURE(82),

    CHANNEL_OPEN(90),
    CHANNEL_OPEN_CONFIRMATION(91),
    CHANNEL_OPEN_FAILURE(92),
    CHANNEL_WINDOW_ADJUST(93),
    CHANNEL_DATA(94),
    CHANNEL_EXTENDED_DATA(95),
    CHANNEL_EOF(96),
    CHANNEL_CLOSE(97),
    CHANNEL_REQUEST(98),
    CHANNEL_SUCCESS(99),
    CHANNEL_FAILURE(100);

    private final byte b;

    private static final Message[] cache = new Message[256];

    static {
        for (Message c : Message.values())
            cache[c.toByte()] = c;
        for (int i = 0; i < 256; i++) {
            if (cache[i] == null)
                cache[i] = UNKNOWN;
        }
    }

    public static Message fromByte(byte b) {
        return cache[b];
    }

    private Message(int b) {
        this.b = (byte) b;
    }

    public boolean geq(int num) {
        return b >= num;
    }

    public boolean gt(int num) {
        return b > num;
    }

    public boolean in(int x, int y) {
        return b >= x && b <= y;
    }

    public boolean leq(int num) {
        return b <= num;
    }

    public boolean lt(int num) {
        return b < num;
    }

    public byte toByte() {
        return b;
    }

}
