package timetable.data;
/*
 * TimePreference.java
 *
 * Created on 15. prosinec 2000, 14:38
 * Documented 8.7.2001
 */

import timetable.util.*;
/** Časové preference zdrojů a aktivit.
 *
 * @author  Tomáš Müller
 * @version 1.0
 */
public class TimePreference implements java.io.Serializable {
    /** Pole slotů. */
    protected int [] slots = null;
    /** Globální konfigurace */
    Config config=null;
    /** Volný slot - default*/
    public static int FREE=0;
    /** HARD podmínka - slot nemůže být použit */
    public static int HARD=1;
    /** SOFT podmínka - slot by neměl být použit */
    public static int SOFT=2;
    
    /**Konstruktor.
     * @param config konfigurace
     */
    public TimePreference(Config config) throws TimetableException {
        this.config=config;
        slots = new int [config.getInt(Config.NR_SLOTS)];
        for (int i=0; i<slots.length; i++ ) slots[i]=FREE;
    }
        
    /** Nastavení preference slotu
     * @param slot číslo slotu
     * @param type podmínka {FREE, SOFT, HARD}
     */
    public void set(int slot, int type) {
        slots[slot]=type;
    }

    /** Zjištění podmínky slotu
     * @param slot číslo slotu
     * @return podmínka {FREE, SOFT, HARD}
     */
    public int get(int slot) {
        return slots[slot];
    }
     
    /** Nastavení podmínky FREE (bez preference) na daný slot
     * @param slot číslo slotu
     */
    public void setFREE(int slot) {
        set(slot,FREE);
    }

    /** Nastavení podmínky SOFT (slot není preferován) na daný slot
     * @param slot číslo slotu
     */
    public void setSOFT(int slot) {
        set(slot,SOFT);
    }

    /** Nastavení podmínky HARD (slot nemůže být použit) na daný slot
     * @param slot číslo slotu
     */
    public void setHARD(int slot) {
        set(slot,HARD);
    }
    
    /** Nastavení podmínky pro více slotů najednou
     * @param startSlot číslo prvního slotu
     * @param endSlot číslo posledního slotu
     * @param type podmínka {FREE, SOFT, HARD}
     */
   
    public void set(int startSlot, int endSlot, int type) {
        for (int i=startSlot;i<=endSlot;i++)
            set(i,type);
    }
    
    /** Je na daném slotu HARD podmínka (slot nemůže být použit) ?
     * @param slot číslo slotu
     * @return true, pokud ano
     */
    public boolean isHARD(int slot) {
        return (get(slot)==HARD);
    }

    /** Je na daném slotu FREE podmínka (slot bez preference) ?
     * @param slot číslo slotu
     * @return true, pokud ano
     */
    public boolean isFREE(int slot) {
        return (get(slot)==FREE);
    }

    /** Je na daném slotu SOFT podmínka (slot by neměl být použit) ?
     * @param slot číslo slotu
     * @return true, pokud ano
     */
    public boolean isSOFT(int slot) {
        return (get(slot)==SOFT);
    }    
          
    /** Textové vyjádření pole podmínek. Například: Po3, Po5, Út4-8
     * @param type podmínka {FREE, SOFT, HARD}
     * @return repreyentace podmínky
     */
   public String toString(int type) throws TimetableException {
       int slot=0;
       int nrDays = config.getInt(Config.NR_DAYS);
       int nrSlots= config.getInt(Config.NR_SLOTS);
       int nrSlotsPerDay = nrSlots/nrDays;
       java.lang.StringBuffer r = new java.lang.StringBuffer();
       do {
           if (get(slot)==type) {
               int j=slot;
               int day=slot/nrSlotsPerDay;
               while (j<nrSlots && get(j)==type && (j/nrSlotsPerDay)==day) j++;
               j--;
               if (slot==j) r.append(""+config.dayOfWeek(j)+" "+(j%nrSlotsPerDay+1)+","); else {
                   r.append(""+config.dayOfWeek(slot)+" "+(slot%nrSlotsPerDay+1)+"-"+(j%nrSlotsPerDay+1)+",");
               };
               slot=j+1;
           } else slot++;
       } while (slot<nrSlots);
       if (r.toString().length()>0) r.deleteCharAt(r.toString().length()-1);
       return r.toString();
   }

   /**Vytvoří jinou instanci stejného pole časových preferencí
    * @return jiná instance stejného pole preferencí
    */
    public Object clone() {
        try {
            TimePreference p = new TimePreference(config);
            for (int i=0;i<p.slots.length;i++) p.slots[i]=slots[i];
            return p;
        } catch (TimetableException e) {};
        return null;
    }

    /** Zápis objektu do streamu
     * @param out stream
     */
    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
       out.writeObject(slots);
   }

   /** Načtení objektu ze streamu
    * @param in stream
    */
   private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {
       slots = (int[]) in.readObject();
   }

}
