//Los comentarios se refieren a cambios respecto lo visto en clase
//Para dar por buena la clase habria que sustituirlos por los comentarios de documentación,
//y quizás alguno de explicación de código.
//Además de someterla a toda clase de test para descubrir debilidades y corregirlas.
package edu.ehu.gtts.gbg.babel;

import java.io.*;
import java.util.*;

public class Babel {

    List<Language> languages=new ArrayList<>();

    public Babel(String dirName) throws FileNotFoundException, IOException {
            BufferedReader br=new BufferedReader(new FileReader(dirName+"/languages.txt"));
            String line;
            while ((line=br.readLine())!=null) {
                line=line.trim();
                if (line.length()==0) continue;
                String id=line.split("\\s")[0];
                try {
                    languages.add(new Language(id, line.substring(id.length()).trim(), dirName+"/txt/"+id+".txt"));
                } catch (IOException ignore) {
                }
            };
            br.close();
    }
    
    //Añado este método que nos resulta util en findMostSimilars y en main, y tiene sentido en todo caso.
    Language getLanguage(String id) {
        for (Language lan: languages) if (lan.getId().equals(id)) return lan;
        return null;
    }
    
    public Language[] findMostSimilars(String id,int n){
        //una vez que decido que la clase auxiliar LangSim sólo la uso en este método, decido hacerla local
        class LangSim {
            Language lA, lB;
            double similarity;
            public LangSim(Language lA, Language lB, double similaridad) {
                this.lA = lA; this.lB = lB; this.similarity = similaridad;
            }
        }
        
        Language lRef=getLanguage(id);

        LangSim[] ls=new LangSim[languages.size()];
        int i=0; for (Language l2: languages) ls[i++]=new LangSim(lRef,l2,Language.similarity(lRef, l2));               

        //Aquí cambio el cuerpo de compare(.) por algo más simple (ojo al "truco")
        Arrays.sort(ls,new Comparator<LangSim>(){
            @Override public int compare(LangSim o1, LangSim o2) {
                return -( new Double(o1.similarity).compareTo(o2.similarity));
            }
        });

        Language[] out=new Language[n];
        for (i=0; i<n; i++) out[i]=ls[i+1].lB;
        return out;
    }

    public static void main(String[] args) throws IOException {
        Babel babel = new Babel("udhr");

        //Hago la busqueda de los 10 más próximos para cuatro lenguajes concretos, Ojo al "truco"
        Language lRef;
        Language[] similar;
        for (String id : new String[]{"spn", "gln", "cln", "bsq"}) {
            lRef = babel.getLanguage(id);
            similar = babel.findMostSimilars(id, 10);
            //Uso una salida con formato
            for (Language lan : similar)
                System.out.printf("similaridad(%s,%s)=%.4f\n", lRef, lan, Language.similarity(lRef, lan));
        }
    }
}