package tracker;
import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
//A Tracker osztály feladatokat és címkéket tart nyilván.
public class Tracker{
	ArrayList<Label> labels=new ArrayList<>();
	ArrayList<Issue> issues=new ArrayList<>();
	//Az osztálynak egy publikus konstruktora legyen, ami egy fájlnevet kap.
	public Tracker(String fileName){
		try{
			BufferedReader r = new BufferedReader(new FileReader(new File(fileName)));
//lab1,lab2,lab3,lab5
//d1@lab1,lab2,lab3:2
//d2@lab2,lab3:3
//d1:2
//d3@lab1:4
//d5@lab4:1 
	//A fájlban az elso sorban címkék vesszovel elválasztott listája van, majd soronként egy-egy feladat.
	String ls=r.readLine();
	String[] labelarr = ls.split(",");
	for(String n:labelarr){
		labels.add(new Label(n));
	}
	//A konstuktor eltárolja a címkéket és végigolvassa a feladatokat.
			for(String line = r.readLine(); line != null; line = r.readLine()) {
					//A feladatokat ellenorzi, hogy helyes formátumú-e, ha nem az, akkor figyelmen kívül hagyja.
					Issue i = Issue.createIssue(line);
					if(i!=null){
						//A konstruktor azt is ellenorzi, hogy a feladatok címkéi szerepelnek-e a tracker címkéi között.
						boolean good=true;
						for(Label l : i.getLabels()){
							boolean found=false;
							for(Label l2 : labels){//todo doWeHaveThisLabel
								if(l.isSame(l2)){
									found=true;
								}
							}
							//Ha nem létezo címkét talál, akkor az adott feladatot figyelmen kívül hagyja.
							if(!found){
								good=false;
							}
						}
						if(good){
							issues.add(i);
						}
					}
					
			}
			r.close();
		}catch(IOException e){
			//Ha a file nem létezik vagy üres, akkor ne tároljon el semmit.
		}
		
	}
	//Készítsünk egy getNumberOfLabels és egy getNumberOfIssues metódust, amelyek megadják a tárolt címkék, illetve feladatok számát. (4 pont)
	public int getNumberOfLabels(){
		return labels.size();
	}
	public int getNumberOfIssues(){
		return issues.size();
	}
	
	private boolean doWeHaveThisLabel(Label l){
		for(Label l2 : labels){
			if(l.isSame(l2)){
				return true;
			}
		}
		return false;
	}

	//Legyen egy find függvény, amellyel keresni lehet a feladatok között.
	//A függvény az elso olyan feladattal térjen vissza, aminek a description adattagja a keresett szöveg.
	//Ha nem talál megfelelot, null-lal tér vissza. (2 pont)
	public Issue find(String d){
		for(Issue i : issues){
			if(i.getDescription().equals(d)){
				return i;
			}
		}
		return null;
	}
	//Legyen egy listByLabel függvény, ami egy címkét kap, és láncolt listában visszaadja az összes feladatot ami rendelkezik az adott címkével.
	
	public LinkedList<Issue> listByLabel(Label l){
		//ha nincs ilyen címke, az eredmény null. (2 pont)
		if(!doWeHaveThisLabel(l)){
			return null;
		}
		LinkedList<Issue> ret=new LinkedList<>();
		for(Issue i : issues){
			if(i.hasLabel(l.getName())){
				ret.add(i);
			}
		}
		//Ha nincs egy sem, de létezik ilyen címke, akkor az eredmény üres lista,
		if(ret.size()==0){
			return ret;
		}
		return ret;
	}
	//Legyen egy isMilestoneComplete függvény, ami egy feladat-csoport azonosítót (egy egész számot) kap,
	//és eldönti, hogy az adott csoporthoz van-e feladat (ha van, akkor hamisat ad vissza, ha nincs, akkor igazat). (2 pont)
	public boolean isMilestoneComplete(int x){
		for(Issue i : issues){
			if(i.getMilestone()==x){
				return false;
			}
		}
		return true;
	}
}