package uk.co.patrickhaston.mars;

public class MarsLinks extends MarsArray 
{
  public MarsLinks(MarsModel model)
  {
    super(model);
    this.CollectionName = "[Links]";
  }
  
  public void readData(String line)
  {
    int idx = readIndex(line);
    if (idx>0)
    {
      MarsLink l = new MarsLink(line);

      this.setElementAt(l, idx);
    }
  }

  public boolean isLinked(int w)
  {
    if(size() < 2) return false;
    for (int i=1; i<size(); i++)
    {
      if(((MarsLink) elementAt(i)).isLinked(w))
      {
        return true;
      }
    }
    return false;
  }

  public boolean isLinked(int w1, int w2)
  {
    if(size() < 2) return false;
    for (int i=1; i<size(); i++)
    {
      if(((MarsLink) elementAt(i)).isLinked(w1, w2))
      {
        return true;
      }
    }
    return false;
  }
  
  public void addLink(int w1, int w2, double dist)
  {
    if(w1 != 0 && w2 != 0)
    {
      addElement(new MarsLink(size(),w1, w2, dist));
      // updated the waypoints with cross references
      theModel.Waypoints.linkCreated(w1, w2, this.size() - 1);
    }
  }
  
  public int[] getEnds(int idx)
  {
    if(idx >= this.size()) return null;
    if(elementAt(idx) == null) return null;
    return ((MarsLink) elementAt(idx)).getEnds();
  }

  public int getType(int idx)
  {
    if(idx >= this.size()) return 0;
    if(elementAt(idx) == null) return 0;
    return ((MarsLink) elementAt(idx)).getType();
  }
  
  public int getOtherEnd(int idx, int wp)
  {
    if(idx >= this.size()) return 0;
    if(elementAt(idx) == null) return 0;
    return ((MarsLink) elementAt(idx)).getOtherEnd(wp);
  }

  public double getAdjustedDistance(int idx)
  {
    if(idx >= this.size()) return 0;
    if(elementAt(idx) == null) return 0;
    int type = ((MarsLink) elementAt(idx)).getType();
    return ((MarsLink) elementAt(idx)).getDistance() * theModel.LinkTypes.getModifier(type);
  }
}
