/*
 * ActivityDependenceInterface.java
 *
 * Created on 21. říjen 2000, 15:31
 * Documented 8.7.2001
 */

package timetable.data;

import timetable.util.*;
/** Základní časové závislosti mezi předměty.
 * <BR>Mezi tyto závislosti patří: (dle typu)
 * <ul><il> 0 .. bez závislosti </li>
 * <li> 1 .. první aktivita před druhou </li>
 * <li> 2 .. první aktivta těsně před druhou </li>
 * <li> 3 .. první aktivita za druhou</li>
 * <li> 4 .. první aktivita těsně za druhou</li>
 * <li> 5 .. souběžný běh aktivit</li></ul>
 *
 * @author Tomáš Müller
 * @version 1.0 
 */
public class TimeActivityDependence extends AbstractActivityDependence {
    /** typ závislosti - bez závislosti */
    public static int NO_DEPENDENCE = 0;
    /** typ závislosti - první před druhou */
    public static int BEFORE = 1;
    /** typ závislosti - první těsně před druhou */
    public static int CLOSELY_BEFORE = 2;
    /** typ závislosti - první za druhou*/
    public static int AFTER = 3;
    /** typ závislosti - první těsně za druhou*/
    public static int CLOSELY_AFTER = 4;
    /** typ závislosti - souběžně*/
    public static int CONCURRENCY = 5;
    /** jméno závislostí */
    public static String DEPENDENCE_NAME = Loc.get("timetable.dependence.timedep"); 
    /** jména závislostí */
    protected static String [] TYPES = {Loc.get("timetable.dependence.timedep.no"),Loc.get("timetable.dependence.timedep.before"),Loc.get("timetable.dependence.timedep.closelybefore"),Loc.get("timetable.dependence.timedep.after"),Loc.get("timetable.dependence.timedep.closelyafter"),Loc.get("timetable.dependence.timedep.concurrently")};

    /**Konstruktor.*/
    public TimeActivityDependence() {
        super();
    }
      
    /** Vrátí jméno závislosti - pro vizualizaci. Např: časová závislots
     * @return jméno závislosti
     */
    public String getDependenceName() { return DEPENDENCE_NAME; }

    /** Vrátí pole jmen jednotlivých typů podmínky - pro vizualizaci ! 
     * @return pole jmen typů
     */
    public String[] getTypes() { return TYPES; }
    
    /** Konstruktor.
     * @param first první aktyvita
     * @param type typ závislosti
     * @param second druhá aktivita
     */
    public TimeActivityDependence(Activity first,int type,Activity second) {
        super(first,second);
        this.type = type;
    }
    
    /** Zjištění splnění podmínky
     * @param activityStart1 začátek první aktivity
     * @param activityStart2 začátek druhé aktivity
     * @return true, pokud bude podmínka splěna
     */
    public boolean isOK(int activityStart1,int activityStart2) {
        if (type==NO_DEPENDENCE || activityStart1==-1 || activityStart2==-1) return true;
        if (type==BEFORE) return activityStart1+first.length<=activityStart2; 
        if (type==CLOSELY_BEFORE) return activityStart1+first.length==activityStart2; 
        if (type==AFTER) return activityStart2+second.length<=activityStart1; 
        if (type==CLOSELY_AFTER) return activityStart2+second.length==activityStart1; 
        if (type==CONCURRENCY) return (activityStart1<=activityStart2 && activityStart2+second.length<=activityStart1+first.length) ||
                                      (activityStart2<=activityStart1 && activityStart1+first.length<=activityStart2+second.length);
        return false;
    }
    
    /** Vrátí řetězec popisující závislost. Tvar: "DEP " + zkratka první aktivity + jméno typu závislosti + zkratka druhé aktivity
     * @return popis závislosti
     */
    public String toString() {
         return "DEP "+first.shortCut+" "+TYPES[type]+" "+second.shortCut;
    }

  /** Zapíše objekt do streamu
    * @param out stream
    * @param allActivities množina všech aktivit
    */
    public void write(java.io.ObjectOutputStream out, ActivityGroup allActivites) throws java.io.IOException {
       out.writeInt(allActivites.indexOf(first));
       out.writeInt(type);
       out.writeInt(allActivites.indexOf(second));
    }

   /** Načte objekt ze streamu
    * @param in stream
    * @param allActivities množina všech aktivit
    * @return načtený objekt
    */  
    public ActivityDependenceInterface read(java.io.ObjectInputStream in, ActivityGroup allActivities) throws java.io.IOException,java.lang.ClassNotFoundException {
       TimeActivityDependence tad = new TimeActivityDependence(
           allActivities.get(in.readInt()),in.readInt(),
           allActivities.get(in.readInt())
       );
       return tad;
    }    
}
