/*PLEASE DO NOT EDIT THIS CODE*/
/*This code was generated using the UMPLE @UMPLE_VERSION@ modeling language!*/

package example;
import java.util.*;

public class Mentor
{

  //------------------------
  // MEMBER VARIABLES
  //------------------------

  //Mentor Attributes
  private String name;

  //Mentor Associations
  private List<Pupil> pupils;

  //------------------------
  // CONSTRUCTOR
  //------------------------

  public Mentor(String aName)
  {
    name = aName;
    pupils = new ArrayList<Pupil>();
  }

  //------------------------
  // INTERFACE
  //------------------------

  public boolean setName(String aName)
  {
    boolean wasSet = false;
    name = aName;
    wasSet = true;
    return wasSet;
  }

  public String getName()
  {
    return name;
  }

  public Pupil getPupil(int index)
  {
    Pupil aPupil = pupils.get(index);
    return aPupil;
  }

  public List<Pupil> getPupils()
  {
    List<Pupil> newPupils = Collections.unmodifiableList(pupils);
    return newPupils;
  }

  public int numberOfPupils()
  {
    int number = pupils.size();
    return number;
  }

  public boolean hasPupils()
  {
    boolean has = pupils.size() > 0;
    return has;
  }

  public int indexOfPupil(Pupil aPupil)
  {
    int index = pupils.indexOf(aPupil);
    return index;
  }

  public boolean isNumberOfPupilsValid()
  {
    boolean isValid = numberOfPupils() >= minimumNumberOfPupils() && numberOfPupils() <= maximumNumberOfPupils();
    return isValid;
  }

  public static int minimumNumberOfPupils()
  {
    return 5;
  }

  public static int maximumNumberOfPupils()
  {
    return 7;
  }

  public Pupil addPupil(String aNumber)
  {
    if (numberOfPupils() >= maximumNumberOfPupils())
    {
      return null;
    }
    else
    {
      return new Pupil(aNumber, this);
    }
  }

  public boolean addPupil(Pupil aPupil)
  {
    boolean wasAdded = false;
    if (pupils.contains(aPupil)) { return false; }
    if (numberOfPupils() >= maximumNumberOfPupils())
    {
      return wasAdded;
    }

    Mentor existingMentor = aPupil.getMentor();
    boolean isNewMentor = existingMentor != null && !this.equals(existingMentor);

    if (isNewMentor && existingMentor.numberOfPupils() <= minimumNumberOfPupils())
    {
      return wasAdded;
    }

    if (isNewMentor)
    {
      aPupil.setMentor(this);
    }
    else
    {
      pupils.add(aPupil);
    }
    wasAdded = true;
    return wasAdded;
  }

  public boolean removePupil(Pupil aPupil)
  {
    boolean wasRemoved = false;
    //Unable to remove aPupil, as it must always have a mentor
    if (this.equals(aPupil.getMentor()))
    {
      return wasRemoved;
    }

    //mentor already at minimum (5)
    if (numberOfPupils() <= minimumNumberOfPupils())
    {
      return wasRemoved;
    }
    pupils.remove(aPupil);
    wasRemoved = true;
    return wasRemoved;
  }

  public boolean addPupilAt(Pupil aPupil, int index)
  {  
    boolean wasAdded = false;
    if(addPupil(aPupil))
    {
      if(index < 0 ) { index = 0; }
      if(index > numberOfPupils()) { index = numberOfPupils() - 1; }
      pupils.remove(aPupil);
      pupils.add(index, aPupil);
      wasAdded = true;
    }
    return wasAdded;
  }

  public boolean addOrMovePupilAt(Pupil aPupil, int index)
  {
    boolean wasAdded = false;
    if(pupils.contains(aPupil))
    {
      if(index < 0 ) { index = 0; }
      if(index > numberOfPupils()) { index = numberOfPupils() - 1; }
      pupils.remove(aPupil);
      pupils.add(index, aPupil);
      wasAdded = true;
    } 
    else 
    {
      wasAdded = addPupilAt(aPupil, index);
    }
    return wasAdded;
  }

  public void delete()
  {
    for(int i=pupils.size(); i > 0; i--)
    {
      Pupil aPupil = pupils.get(i - 1);
      aPupil.delete();
    }
  }


  public String toString()
  {
    return super.toString() + "["+
            "name" + ":" + getName()+ "]";
  }
}
