package Obchodak;

//pomoci Haldy implementovane Polem
public class MinoritniFronta {

	// Promenne
	final int MAX=100;
	private int pocet;
	private Dodavatel[] minHalda;
	
	// Konstruktor
	MinoritniFronta(){
		minHalda=new Dodavatel[MAX+1];
		pocet=0;
	}
	
	// Procedury
	// Zjisti zda je halda prazdna
	boolean jePrazdna(){
		return (pocet==0);
	}
	
	// Vymen (obcas potreba :)
	private void vymen(int a,int b){
		Dodavatel pom;
		pom=minHalda[a];
		minHalda[a]=minHalda[b];
		minHalda[b]=pom;
	}
	
	// Dolu pro obnoveni haldy
	private void dolu(int pocet){
		int k=1;
		while (2*k <= pocet){
			int j=2*k;
			if (j<pocet && minHalda[j].cena > minHalda[j+1].cena) j++;
			if (minHalda[k].cena <= minHalda[j].cena) break;
			vymen(j,k);
			k=j;
		}
	}
	
	// Nahoru pro obnoveni haldy
	private void nahoru(int nahoru){
		while(nahoru>1 && minHalda[nahoru].cena < minHalda[nahoru/2].cena){
			vymen(nahoru,nahoru/2);		
			nahoru=nahoru/2;
		}
	}
	
	// Odstran minimum (pokud nesplnuje co ma)
	Dodavatel odstranMin(){		
		vymen(1,pocet);
		dolu(pocet-1);
		return minHalda[pocet--];
	}
	
	// Vloz dodavatele (a uprav haldu)
	void vlozDodavatele(int cena, int dod){		
		minHalda[++pocet]=new Dodavatel(cena,dod);
		nahoru(pocet);	
	}
	
	//Vytiskni minimum
	void tiskniMin(){
		System.out.println("Dodavatel: "+ minHalda[1].kodDodavatele +" Cena: "+ minHalda[1].cena);
	}

	//Vytiskni celou haldu / pro kontrolu
	void tiskniHaldu(){
		for (int i=1;i<pocet+1;i++)
			System.out.print(minHalda[i].cena +" ");
		System.out.println();	
	}
	
	// Jen vrat ukazatele na vrchol minHaldy
	Dodavatel vyberMin(){
		return minHalda[1];
	}	
}
