//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 Language {
    
    private String id;
    private String descriptor;
    private Map<Character, Double> histogram=new TreeMap<>();

    public String getId() {return id;}
    public String getDescriptor() {return descriptor;}
    
    public Language(String id, String descriptor, String fileName) throws FileNotFoundException, IOException {
        this.id = id;
        this.descriptor = descriptor;
        
        int NumCharacters=0;
        BufferedReader br=new BufferedReader(new FileReader(fileName));
        String line;
        while ((line=br.readLine())!=null) {
            line=line.trim();
            if (line.length()==0) continue;
            
            //Aquí hacíamos un filtrado que pensándolo mejor es inadecuado,
            //porque el uso de espacios y signos de puntuación aporta información sobre el idioma
            //ponía: linea=linea.replaceAll("[^a-zA-Z]", "");
            //Los resultados ahora coinciden con el enunciado.
            
            for (int i=0; i<line.length();i++) {
                char c=line.charAt(i);
                Character oc=new Character(c);
                histogram.put(oc,new Double(histogram.get(oc)==null?1:histogram.get(oc)+1));
                NumCharacters++;
            }
        }
        
        for ( Character key : histogram.keySet() ) 
            histogram.put(key, new Double(histogram.get(key)/NumCharacters));
        br.close();
    }

    @Override //me limito a devolver el descriptor
    public String toString() {
        return descriptor;
    }
   
    public static double similarity(Language a, Language b){
        if (a==null || b==null) throw new IllegalArgumentException();
        double similarity=0;
        for ( Character key : a.histogram.keySet() ) 
           similarity+=Math.min(a.histogram.get(key),b.histogram.get(key)==null?0:b.histogram.get(key));
        return similarity;
    }
    
//    public static void main(String[] args) throws IOException{
//        Language spn=new Language("spn","spn","udhr/txt/spn.txt");
//        Language gln=new Language("gln","gln","udhr/txt/gln.txt");
//        Language cln=new Language("cln","cln","udhr/txt/cln.txt");
//        Language bsq=new Language("bsq","bsq","udhr/txt/bsq.txt");
//        System.out.println("spn gln "+Language.similarity(spn, gln));
//        System.out.println("spn cln "+Language.similarity(spn, cln));
//        System.out.println("spn bsq "+Language.similarity(spn, bsq));
//    }
    
}