/*******************************************************************************
 * 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 org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
import org.eclipse.osee.ote.message.Message;
import org.eclipse.osee.ote.message.data.MemoryResource;
import org.eclipse.osee.ote.message.data.MessageData;
import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingEnumeratedElement;
import org.eclipse.osee.ote.message.interfaces.ITestAccessor;

/**
 * @author Ryan D. Brooks
 * @author Andrew M. Finkbeiner
 */
public class EnumeratedElement<T extends Enum<T> & IEnumValue<T>> extends DiscreteElement<T> {

   private final Class<T> clazz;
   private final T[] values;

   public EnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
      super(msg, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
      this.clazz = clazz;

      values = clazz.getEnumConstants();
   }

   public EnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb) {
      this(msg, elementName, clazz, messageData, byteOffset, msb, lsb, msb, lsb);
   }

   private T getValue(int intVal) {
      T undefined = null;
      for (T val : values) {
         if (val.getIntValue() == intVal) {
            return val;
         } else if (undefined == null) {
            undefined = val.getEnum(intVal);
         }
      }
      return undefined;
   }

   public EnumeratedElement(Message message, String elementName, Class<T> clazz, MessageData messageData, int bitOffset, int bitLength) {
      super(message, elementName, messageData, bitOffset, bitLength);
      this.clazz = clazz;

      values = clazz.getEnumConstants();
   }

   public int getIntValue() {
      return getMsgData().getMem().getInt(byteOffset, msb, lsb);
   }

   /**
    * Sets the element to the "value" passed and immediately sends the meessage that contains it.
    * 
    * @param enumeration The value to set.
    */
   public void setAndSend(ITestEnvironmentAccessor accessor, T enumeration) {
      this.set(accessor, enumeration);
      super.sendMessage();
   }

   /**
    * Waits until the element is set to a value not in the "list" passed
    * 
    * @param list The list of values to check against
    * @param milliseconds Number of milliseconds to wait before failing.
    * @return last value observed
    */
   public T waitForNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
      return this.waitForList(accessor, list, false, milliseconds);
   }

   /**
    * Waits until the element is set to a value in the "list" passed
    * 
    * @param list The list of values to check against
    * @param milliseconds Number of milliseconds to wait before failing.
    * @return last value observed
    */
   public T waitForInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
      return this.waitForList(accessor, list, true, milliseconds);
   }

   /**
    * This function will verify that this signal is pulsed for 2 cycles.
    * 
    * @param value The value to be checked
    */
   public void checkPulse(ITestAccessor accessor, T value) throws InterruptedException {

      T nonPulsedValue = getValue(0);
      if (value == nonPulsedValue) {
         nonPulsedValue = getValue(1);
      }

      checkPulse(accessor, value, nonPulsedValue);

   }

   @SuppressWarnings({ "unchecked", "rawtypes" })
   @Override
   public EnumeratedElement<T> findElementInMessages(Collection<? extends Message> messages) {
      return (EnumeratedElement<T>) super.findElementInMessages(messages);
   }
   
   @Override
   @SuppressWarnings("unchecked")
   public EnumeratedElement<T> switchMessages(Collection<? extends Message<?,?,?>> messages) {
      return (EnumeratedElement<T>) super.switchMessages(messages);
   }

   protected T toEnum(int intValue) {
      final T val = getValue(intValue);
      if (val != null) {
         return val;
      }
      throw new IllegalArgumentException(
         "No enum value associated with the integer value " + intValue + " for element " + getName());
   }

   @Override
   public T getValue() {
      return toEnum(getMsgData().getMem().getInt(byteOffset, msb, lsb));
   }

   @Override
   public T valueOf(MemoryResource otherMem) {
      return toEnum(otherMem.getInt(byteOffset, msb, lsb));
   }

   @Override
   public void setValue(T obj) {
      getMsgData().getMem().setInt(obj.getIntValue(), byteOffset, msb, lsb);
   }

   public T[] getEnumValues() {
      return clazz.getEnumConstants();
   }

   @Override
   public String toString(T obj) {
      return String.format("%s [%d]", obj.name(), obj.getIntValue());
   }

   @Override
   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
      this.set(accessor, Enum.valueOf(clazz, value));
   }

   public void set(String value) throws IllegalArgumentException {
      this.setValue(Enum.valueOf(clazz, value));
   }

   public void setbyEnumIndex(int index) throws IllegalArgumentException {
      getMsgData().getMem().setInt(values[index].getIntValue(), byteOffset, msb, lsb);
   }

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

   @Override
   protected NonMappingEnumeratedElement<T> getNonMappingElement() {
      return new NonMappingEnumeratedElement<T>(this);
   }

   @Override
   public String valueOf() {
      return String.format("%s [%d]", getValue().name(), getIntValue());
   }

   public Class<T> getEnumClass() {
      return clazz;
   }

   @Override
   public T elementMask(T value) {
      return value;
   }
}