import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;


public class EditGraph {
	
	LDAG eg;
	

	/**
	 * Costruisce un grafo di modifica per risolvere il problema LCS 
	 * a partire da due stringhe di nucleotidi
	 */
	public EditGraph(Nucleotide[] v, Nucleotide[] w) {
	eg = new LDAG();

	System.err.println(Arrays.toString(v));
	System.err.println(Arrays.toString(w));
	
	int nodiRighe = v.length+1;
	int nodiColonne = w.length+1;
	System.out.println("Nodi righe e colonne "+nodiRighe+" "+nodiColonne);
	int id = 0;
	//ciclo sulle righe
	for (int i = 0; i < v.length; i++) {
		//ciclo sulle colonne
		for (int j = 0; j < w.length; j++) {
			eg.add(new AOEtichettato(id,id+1,0,"<-,"+w[j]+">"));
			System.out.println("arco "+"-"+" "+w[j]);
			eg.add(new AOEtichettato(id,id+nodiRighe,0,"<"+v[i]+",->"));
			System.out.println("arco "+v[i]+" "+"-");
			if (v[i]==w[j]){
				eg.add(new AOEtichettato(id,id+nodiRighe+1,1,"<"+v[i]+","+w[j]+">"));
				System.out.println("arco "+v[i]+" "+w[j]);					
			}
			id++;
		}
		eg.add(new AOEtichettato(id,id+nodiRighe,0,"<"+v[i]+",->"));
		System.out.println("arco "+v[i]+" "+"-");
		id++;
	}
	id = nodiColonne*(nodiRighe-1);
	for (int j = 0; j < w.length; j++) {
		eg.add(new AOEtichettato(id,id+1,0,"<-,"+w[j]+">"));
		System.out.println("arco "+"-"+" "+w[j]);
		id++;
	}
	
}

	
	
	public static void main(String[] args) {
		Nucleotide[] v = {Nucleotide.A,Nucleotide.T};
		Nucleotide[] w = {Nucleotide.A,Nucleotide.G};
		EditGraph e = new EditGraph(v,w);
		System.out.println(e.eg);
	
		LongestPath lp = new LongestPath();
		System.out.println("Longest Path "+lp.computeLongestPath(e.eg, 0, (v.length+1)*(w.length+1)-1));
		System.out.println("Longest labelled Path "+ e.computeLabelledPath(0, (v.length+1)*(w.length+1)-1));
	
	}
	
	/**
	 * Calcola il cammino come archi etichettati 
	 * da src a snk sul grafo di modifica LCS
	 * 
	 * @param src nodo di partenza
	 * @param snk nodo destinazione
	 * @return il cammino etichettato da src a snk
	 */
	public List<Object> computeLabelledPath(Object src, Object snk) {
		System.out.println("metodo da implementare");
		return null;
	}
	
}
