/*
 * HumanValueSelection.java
 *
 * Created on 25. únor 2001, 19:03
 * Documented 18. 7. 2001
 */

package timetable.solver.strategy.value;

import timetable.data.*;
import timetable.solver.strategy.price.*;
import timetable.solver.strategy.*;
import timetable.util.*;
/** Heuristika výběru umístění - výběr provede uživatel pomocí dialogu HumanValueSelectionDlg.
 * Výběr je veden ohodnocením SingleActivityEvaluation - umístění jsou seřazena dle této heuristiky, je jich maximálně N.
 *
 * @author Tomáš Müller
 * @version 1.0
 */
public class HumanValueSelection extends AbstractValueSelection {
    /** Výběr N=50 nejlepších umístění, které se budou prezentovat uživateli. počet*/
    protected int TOP10MAX=50;
    /** Výběr N=50 nejlepších umístění, které se budou prezentovat uživateli. třída zajištující výběr*/
    Top10Value top10 = null;
    /** Vybrané umístění */
    int selected=0;
    
    /** Konstruktor.
     * @param config konfigurace
     * @param evaluation ohodnocovací funkce
     */
    public HumanValueSelection(Config config,SingleActivityEvaluationInterface evaluation) throws TimetableException {
        super(config,evaluation);
        top10 = new Top10Value(TOP10MAX);        
    }
    
    /** Nastavení aktivity, pro kterou se bude umístění hledat. Reset heuristiky.
     * @param activity vybraná aktivita
     */
    public void reset(Activity activity) {
        top10.reset();
        this.activity = activity;
    }
    
        
    /** Přidání možného umístění do výběru. 
     * @param slot počáteční slot 
     * @param selectedResources vybrané zdroje
     * @param dependences množina všech závislostí
     * @param conflictActivities množina aktivit, které jsou s daným umístěním v konfliktu - budou se muset z rozvrhu odebrat v případě zvolení tohoto umístění
     */
    public void addValue(int slot,ActivityResources selectedResources,ActivityDependenceGroup dependences,ActivityGroup conflictActivities) throws TimetableException {
        int adept = evaluation.value(activity,slot,selectedResources,dependences,conflictActivities);
        config.log("      VALUE="+adept);
        if (top10.willBeAdded(adept)) {
            top10.add(adept,slot,(ActivityResources)selectedResources.clone(),conflictActivities);
            config.log("        ADDED");
        }
    }
    
   /** Metoda provede výběr umístění. */
     public void select() throws TimetableException {
        if (top10.size()==0) { selected=-1;return;}
        HumanValueSelectionDlg dlg = new HumanValueSelectionDlg(null,config);
        for (int i=0;i<top10.size();i++) 
            dlg.addAdept(top10.slot(i),top10.resources(i).toString(),top10.activities(i).toString());
        dlg.show();
        selected = dlg.getSelected();
    }
    
    /** Vrací vybrané umístění.
     * @return počáteční slot
     */
    public int selectedSlot() {
        return (selected<0?-1:top10.slot(selected));
    }

    /** Vrací vybrané umístění.
     * @return vybrané zdroje
     */
    public ActivityResources selectedResources() {
        return (selected<0?null:top10.resources(selected));
    }
    
    /** Vrací vybrané umístění.
     * @return konfliktní aktivity
     */
    public ActivityGroup selectedConflictActivities() {
        return (selected<0?null:top10.activities(selected));
    }
    
}