package autoservis;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Sklad {

	// Sklad je seznam Polozek skladu
	List<Polozka> sklad=new ArrayList<Polozka>();
	// Soubor do ktereho se sklad bude ukladat
	final File skladFile=new File("sklad.dat");
	
	// Kontruktor skladu, sklad je defaultne prazdny 
	Sklad(){
	}
	
	// Vloz polozku do skladu
	void add(String nazev, float nakupniCena, int mnozstvi){
		if (mnozstvi >0){
				if (nakupniCena >0) { 
					if (nazev.length()>2){
						Polozka p=new Polozka(nazev,sklad.size(),nakupniCena,mnozstvi);
						sklad.add(p);
					}
					else {
						System.out.println("Nazev polozky musi byt alespon 3 znaky");
					}
				}
				else {
					System.out.println("Nelze nakoupit zadarmo");
				}
		}
		else {
			System.out.println("Nelze nakoupit mene nez 1 kus zbozi");
		}
			
	}
	
	// Vrat pocet polozek ve skladu
	int size(){
		return sklad.size();
	}
	
	//Vydej ze skladu (sniz mnozstvi dane polozky)
	void pop(int kod, int pocetVydanych){
		if (kod >= 0 && kod < sklad.size()){
			if (sklad.get(kod).mnozstvi >= pocetVydanych){
				System.out.println("------------------------------------------------------");
				System.out.println("Vydano "+pocetVydanych+" kusu polozky: "+sklad.get(kod).nazev);
				System.out.println("Jednotkova cena: "+ sklad.get(kod).nakupniCena*(1+(sklad.get(kod).rabat/100)));
				System.out.println("Celkova cena: "+ sklad.get(kod).nakupniCena*(1+(sklad.get(kod).rabat/100))*pocetVydanych);
				sklad.get(kod).mnozstvi=sklad.get(kod).mnozstvi-pocetVydanych;
			}
			else {
				System.out.println("Na sklade neni dostatecny pocet kusu, nelze vydat !");
			}			
		}	
		else {
			System.out.println("Zadany kod neexistuje");
		}
	}

	//Pridej dalsi kusy uz existujici polozky (zvys mnozstvi dane polozky)
	void push(int kod, int pocetVlozenych){
		if (kod >= 0 && kod < sklad.size()){
			if (pocetVlozenych >0){
				System.out.println("------------------------------------------------------");
				System.out.println("Vlozeno "+pocetVlozenych+" kusu polozky: "+sklad.get(kod).nazev);
				sklad.get(kod).mnozstvi=sklad.get(kod).mnozstvi+pocetVlozenych;
			}
			else {
				System.out.println("Pocet pridanych polozek musi byt vetsi nez 0");
			}	
		}	
		else {
			System.out.println("Zadany kod neexistuje");
		}
	}
	
	// Hledej polozku
	void search(String hledane){
		if (!sklad.isEmpty()){
			System.out.println("------------------------------------------------------");
			System.out.println("Hledam polozky odpovidajici zadanemu:");
			String regex=".*"+hledane+".*";
			int j=0;
			for (int i=0; i<sklad.size(); i++){				
				if (sklad.get(i).nazev.matches(regex)){
					sklad.get(i).print();
				j++;
				}
			}	
			if (j==0){
				System.out.println("Zadna polozka ve skladu neopdovida zadani");
			}
		}	
		else{
			System.out.println("Sklad je prazdny");
		}				
	}
	
	// vytiskni polozky skladu
	void print(){
		System.out.println("Vypis celeho skladu:");
		if (!sklad.isEmpty()){
			for (int i=0; i<sklad.size(); i++){
				if (sklad.get(i).mnozstvi>0){
					sklad.get(i).print();
				}
			}	
		}	
		else{
			System.out.println("Sklad je prazdny");
		}		
	}	

	// vytiskni polozky s kritickym mnozstvim
	void printKriticke(){
		System.out.println("Vypis polozek s kritickym mnozstvim:");
		if (!sklad.isEmpty()){
			int j=0;
			for (int i=0; i<sklad.size(); i++){
				if (sklad.get(i).isCritical()){ 
					sklad.get(i).print();
					j++;		
				}	
			}
			if (j==0){
				System.out.println("Ve skladu nejsou polozky pod kritickym mnostvim");
			}		
		}	
		else{
			System.out.println("Sklad je prazdny");
		}			
	}	

	//Zapis Objektu na disk
    private static final Object readObjectFromFile(File fileName) {
        try {
                Object object = new ObjectInputStream(new BufferedInputStream(new FileInputStream(fileName))).readObject();
                return object;
        }
        catch (Exception e) {
        	e.printStackTrace();
            return null;
        }
    }
    
    //Cteni objektu z disku
    private static final void writeObjectToFile(File fileName, Object object) {
    	try {
    		ObjectOutputStream stream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(fileName)));
    		stream.writeObject(object);
    		stream.close();
    	}
    	catch (Exception e) {
    		e.printStackTrace();
    	}
    }

    void save(){
    	writeObjectToFile(skladFile,sklad);
    }

    void load(){
    	sklad.clear();
    	sklad=(ArrayList<Polozka>)readObjectFromFile(skladFile);
    }    
}

