/**
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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 org.apache.kerby.xdr.type;

import org.apache.kerby.xdr.XdrDataType;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;

/**
 * Xdr Boolean type from RFC 4506
 * Boolean type has the same representation as signed integers.
 */
public class XdrBoolean extends XdrSimple<Boolean> {
    private static final byte[] TRUE_BYTE = new byte[]
        {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01};
    private static final byte[] FALSE_BYTE = new byte[]
        {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};

    public static final XdrBoolean TRUE = new XdrBoolean(true);
    public static final XdrBoolean FALSE = new XdrBoolean(false);

    /**
     * Default constructor, generally for decoding as a container
     */
    public XdrBoolean() {
        this(null);
    }

    /**
     * Constructor with a value, generally for encoding of the value
     * @param value The boolean value
     */
    public XdrBoolean(Boolean value) {
        super(XdrDataType.BOOLEAN, value);
    }

    /**
     * The length of a signed integer is 4.
     * @return Length of a boolean type.
     */
    @Override
    protected int encodingBodyLength() {
        return 4;
    }

    /**
     * Encode boolean type to bytes.
     */
    @Override
    protected void toBytes() {
        setBytes(getValue() ? TRUE_BYTE : FALSE_BYTE);
    }

    /**
     * Decode bytes to boolean value.
     * @throws IOException Wrong bytes for boolean.
     */
    @Override
    protected void toValue() throws IOException {
        if (getBytes().length != 4) {
            byte[] boolBytes = ByteBuffer.allocate(4).put(getBytes(), 0, 4).array();
            /**reset bytes in case the enum type is in a struct or union*/
            setBytes(boolBytes);
        }

        byte[] bytes = getBytes();
        if (Arrays.equals(bytes, TRUE_BYTE)) {
            setValue(true);
        } else if (Arrays.equals(bytes, FALSE_BYTE)) {
            setValue(false);
        } else {
            throw new IOException("Fail to decode boolean type: " + bytes.toString());
        }
    }
}
