/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.message.elements;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.osee.ote.message.Message;
import org.eclipse.osee.ote.message.data.MessageData;
import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingRecordElement;

/**
 * @author Ryan D. Brooks
 * @author Andrew M. Finkbeiner
 */
public abstract class RecordElement extends Element {

   private final Map<String, Element> elementMap;
   private final int recordBitSize;

   private int bitOffset;
   private final int index;
   private boolean isPartOfMap = true;
   private final int firstRecordBitOffset;
   public int BIT_OFFSET;

   /**
    * @param message -
    * @param elementName -
    */
   public RecordElement(Message message, String elementName, int index, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
      super(message, elementName, messageData, firstRecordBitOffset + index * recordBitSize, recordBitSize);
      elementMap = new LinkedHashMap<>();
      BIT_OFFSET = this.bitOffset = firstRecordBitOffset + index * recordBitSize;
      this.recordBitSize = recordBitSize;
      this.firstRecordBitOffset = firstRecordBitOffset;
      this.index = index;
   }

   public RecordElement(Message message, String elementName, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
      this(message, elementName, 0, messageData, firstRecordBitOffset, recordBitSize);
      isPartOfMap = false;
   }

   public void addElements(Element... elements) {
      for (Element element : elements) {
         elementMap.put(element.elementName, element);
      }
   }

   @Override
   public void addPath(Object... objs) {
      for (Object obj : objs) {
         getElementPath().add(obj);
      }
      if (isPartOfMap) {
         getElementPath().add(index);
      } else {
         getElementPath().add(getElementName());
      }
      Object[] myPath = getElementPath().toArray();
      for (Element el : elementMap.values()) {
         el.addPath(myPath);
      }
   }

   public RecordElement(RecordElement message, String elementName, int offset, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
      this(message.getMessage(), elementName, offset, messageData, firstRecordByteOffset, recordByteSize);
      isPartOfMap = false;
   }

   public Map<String, Element> getElementMap() {
      return this.elementMap;
   }

   @Override
   protected NonMappingRecordElement getNonMappingElement() {
      return new NonMappingRecordElement(this);
   }

   @Override
   public RecordElement findElementInMessages(Collection<? extends Message> messages) {
      return (RecordElement) super.findElementInMessages(messages);
   }
   
   public RecordElement switchMessagesNew(Collection<? extends Message<?,?,?>> messages) {
      return (RecordElement) super.switchMessages(messages);
   }
   
   public void put(int index, RecordElement newRecord) {
      // records.put(index, (T)newRecord);
   }

   public int length() {
      return -1;
   }

   public RecordElement get(int index) {
      // T val = records.get(index);
      // if(val == null){
      // val = (T)factory.create(index);
      // records.put(index, val);
      // }
      return null;
   }

   /**
    * @return the firstRecordBitOffset
    */
   public int getFirstRecordBitOffset() {
      return firstRecordBitOffset;
   }

   /**
    * @return the bitOffset
    */
   public int getBitOffset() {
      return bitOffset;
   }

   /**
    * @return the recordBitSize
    */
   public int getRecordBitSize() {
      return recordBitSize;
   }

   @Override
   public void visit(IElementVisitor visitor) {
      visitor.asRecordElement(this);
   }

   @Override
   public void zeroize() {
      for (Element el : elementMap.values()) {
         el.zeroize();
      }
   }

   @Override
   public String getDescriptiveName() {
      if (isPartOfMap) {
         return String.format("%s[%d]", getName(), index);
      }
      return getName();
   }

   public int getIndex() {
      return index;
   }
}