/*
 * Copyright (C) 2010 ZXing authors
 *
 * 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.
 */

/*
 * These authors would like to acknowledge the Spanish Ministry of Industry,
 * Tourism and Trade, for the support in the project TSI020301-2008-2
 * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled
 * Mobile Dynamic Environments", led by Treelogic
 * ( http://www.treelogic.com/ ):
 *
 *   http://www.piramidepse.com/
 */

using System.Collections.Generic;
using ZXing.Common;

namespace ZXing.OneD.RSS.Expanded
{
    /// <summary>
    /// <author>Pablo Orduña, University of Deusto (pablo.orduna@deusto.es)</author>
    /// <author>Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es)</author>
    /// </summary>
    static class BitArrayBuilder
    {
        internal static BitArray buildBitArray(List<ExpandedPair> pairs)
        {
            int charNumber = (pairs.Count << 1) - 1;
            if (pairs[pairs.Count - 1].RightChar == null)
            {
                charNumber -= 1;
            }

            int size = 12 * charNumber;

            BitArray binary = new BitArray(size);
            int accPos = 0;

            ExpandedPair firstPair = pairs[0];
            int firstValue = firstPair.RightChar.Value;
            for (int i = 11; i >= 0; --i)
            {
                if ((firstValue & (1 << i)) != 0)
                {
                    binary[accPos] = true;
                }
                accPos++;
            }

            for (int i = 1; i < pairs.Count; ++i)
            {
                ExpandedPair currentPair = pairs[i];

                int leftValue = currentPair.LeftChar.Value;
                for (int j = 11; j >= 0; --j)
                {
                    if ((leftValue & (1 << j)) != 0)
                    {
                        binary[accPos] = true;
                    }
                    accPos++;
                }

                if (currentPair.RightChar != null)
                {
                    int rightValue = currentPair.RightChar.Value;
                    for (int j = 11; j >= 0; --j)
                    {
                        if ((rightValue & (1 << j)) != 0)
                        {
                            binary[accPos] = true;
                        }
                        accPos++;
                    }
                }
            }
            return binary;
        }
    }
}
