/*
 *  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.directory.api.ldap.codec.factory;

import java.util.Iterator;

import org.apache.directory.api.asn1.ber.tlv.BerValue;
import org.apache.directory.api.asn1.util.Asn1Buffer;
import org.apache.directory.api.ldap.codec.api.LdapApiService;
import org.apache.directory.api.ldap.codec.api.LdapCodecConstants;
import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.entry.Value;
import org.apache.directory.api.ldap.model.message.AddRequest;
import org.apache.directory.api.ldap.model.message.Message;
import org.apache.directory.api.util.CollectionUtils;
import org.apache.directory.api.util.Strings;

/**
 * The AddRequest factory.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public final class AddRequestFactory implements Messagefactory
{
    /** The static instance */
    public static final AddRequestFactory INSTANCE = new AddRequestFactory();

    private AddRequestFactory()
    {
        // Nothing to do
    }


    /**
     * Encode an entry's Attribute's values. It's done in reverse order, to have the
     * last value encoded first in the reverse buffer.
     * <br>
     * The values are encoded this way :
     * <pre>
     * 0x31 LL attributeValues
     *   0x04 LL attributeValue
     *   ...
     *   0x04 LL attributeValue
     * </pre>
     *
     * @param buffer The buffer where to put the PDU
     * @param iterator The iterator built on top of the values
     */
    private void encodeValueReverse( Asn1Buffer buffer, Iterator<Value> iterator )
    {
        iterator = CollectionUtils.reverse( iterator );
        while ( iterator.hasNext() )
        {
            Value value = iterator.next();

            // Encode the value
            BerValue.encodeOctetString( buffer, value.getBytes() );
        }
    }


    /**
     * Encode the attributes, starting from the end. We iterate through the list
     * of attributes in reverse order. The last attribute will be encoded first, when
     * the end of the list will be reached, which is what we went, as we encode from
     * the end.
     * <br>
     * An attribute is encoded this way:
     * <pre>
     *     0x30 LL attribute
     *       0x04 LL attributeType
     *       0x31 LL attributeValues
     *         0x04 LL attributeValue
     *         ...
     *         0x04 LL attributeValue
     * </pre>
     *
     * @param buffer The buffer where to put the PDU
     * @param iterator The iterator built on top of the attributes
     */
    private void encodeAttributeReverse( Asn1Buffer buffer, Iterator<Attribute> iterator )
    {
        iterator = CollectionUtils.reverse( iterator );
        while ( iterator.hasNext() )
        {
            Attribute attribute = iterator.next();

            // Remind the current position
            int start = buffer.getPos();

            // The attributes values
            if ( attribute.size() == 0 )
            {
                BerValue.encodeOctetString( buffer, Strings.EMPTY_BYTES );
            }
            else
            {
                encodeValueReverse( buffer, attribute.iterator() );
            }

            // Then the values' SET
            BerValue.encodeSet( buffer, start );

            // The attribute type
            BerValue.encodeOctetString( buffer, attribute.getUpId() );

            // The attribute sequence
            BerValue.encodeSequence( buffer, start );
        }
    }

    /**
     * Encode the AddRequest message to a PDU.
     * <br>
     * AddRequest :
     * <pre>
     * 0x68 LL
     *   0x04 LL entry
     *   0x30 LL attributesList
     *     0x30 LL attribute
     *       0x04 LL attributeDescription
     *       0x31 LL attributeValues
     *         0x04 LL attributeValue
     *         ...
     *         0x04 LL attributeValue
     *     ...
     *     0x30 LL attribute
     *       0x04 LL attributeDescription
     *       0x31 LL attributeValue
     *         0x04 LL attributeValue
     *         ...
     *         0x04 LL attributeValue
     * </pre>
     *
     * @param codec The LdapApiService instance
     * @param buffer The buffer where to put the PDU
     * @param message the AbandonRequest to encode
     */
    @Override
    public void encodeReverse( LdapApiService codec, Asn1Buffer buffer, Message message )
    {
        int start = buffer.getPos();
        AddRequest addRequest = ( AddRequest ) message;

        // The partial attribute list
        Entry entry = addRequest.getEntry();

        if ( entry.size() != 0 )
        {
            // Encode the attributes
            encodeAttributeReverse( buffer, entry.iterator() );
        }

        // The attributes sequence
        BerValue.encodeSequence( buffer, start );

        // The entry DN
        BerValue.encodeOctetString( buffer, entry.getDn().getName() );

        // The AddRequest Tag
        BerValue.encodeSequence( buffer, LdapCodecConstants.ADD_REQUEST_TAG, start );
    }
}
