
package jerarquiapolimorfica;

import encapsuladores.Estado;
import excepciones.GenericaExcepcion;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class EstructuraXML implements EstructuraGenerica {
   
    Document document;
    Element raiz;
    byte numeroEstadosIntroducidos = 0;

    public EstructuraXML() {
        raiz = new Element("ESTADOS");
        document = new Document(raiz);  
    }
    
    @Override
    public void insertarEstado(Estado estado) {  
        estado.setIdEstado(numeroEstadosIntroducidos + 1);
        
        Element elementEstado = new Element("ESTADO");
        elementEstado.setAttribute("id_estado", Integer.toString(estado.getIdEstado()));
        Element nombre = new Element("NOMBRE");
        nombre.setText(estado.getNombre());
        Element numeroHabitantes = new Element("NUMERO_HABITANTES");
        numeroHabitantes.setText(Integer.toString(estado.getNumeroHabitantes()));
        elementEstado.addContent(nombre);
        elementEstado.addContent(numeroHabitantes);
        raiz.addContent(elementEstado);   
        
        numeroEstadosIntroducidos++;
    }
    
    @Override
    public Estado getEstado(Estado estado) throws GenericaExcepcion {
        if (estado.getIdEstado() < 1  ||  estado.getIdEstado() > numeroEstadosIntroducidos)
            throw new GenericaExcepcion(-30);
        
        Estado estadoADevolver = null;
        
        boolean encontrado = false;
        List<Element> listaEstados = raiz.getChildren("ESTADO");
                //   Recorremos List con Iterator
        Iterator iteratorEstados = listaEstados.iterator(); 
        while (iteratorEstados.hasNext() && !encontrado) {                        
            Element elementEstado = (Element)iteratorEstados.next(); 
            int estadoLeido = Integer.parseInt(elementEstado.getAttributeValue("id_estado"));
            if (estadoLeido == estado.getIdEstado()) {
                encontrado = true;
                estadoADevolver = new Estado();
                estadoADevolver.setIdEstado(estadoLeido);
                estadoADevolver.setNombre((elementEstado.getChild("NOMBRE")).getText());
                estadoADevolver.setNumeroHabitantes(Integer.parseInt((elementEstado.getChild("NUMERO_HABITANTES")).getText()));
            }
        }    
            
        return estadoADevolver;
    }
    
    @Override
    public String getConjuntoEstados() {   
        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();       
        DecimalFormat decimalFormat = new DecimalFormat("###,###,###,##0", decimalFormatSymbols);
        decimalFormatSymbols.setDecimalSeparator(',');
        decimalFormatSymbols.setGroupingSeparator('.');
        
        StringBuffer aglutinadoADevolver = new StringBuffer();       
        
        Element elementEstado, nombre, numeroHabitantes;
        List<Element> listaEstados = raiz.getChildren("ESTADO");
                //   Recorremos List con estructura de control for        
        for (int i=0; i<listaEstados.size(); i++) {
            elementEstado = listaEstados.get(i);       
            aglutinadoADevolver.append(String.format("%3s", elementEstado.getAttributeValue("id_estado")));
            aglutinadoADevolver.append("  ");
            aglutinadoADevolver.append(String.format("%-30s", (elementEstado.getChild("NOMBRE")).getText()));
            aglutinadoADevolver.append("  ");
            aglutinadoADevolver.append(String.format("%15s",decimalFormat.format( Integer.parseInt((elementEstado.getChild("NUMERO_HABITANTES")).getText()) )));
            aglutinadoADevolver.append("\n");              
        }
        
        return new String(aglutinadoADevolver);
    }
    
    @Override
    public int getNumeroEstados() {
        return numeroEstadosIntroducidos;
    }  
    
    @Override
    public void salvarDatos() throws Exception {
        
        Format format = Format.getPrettyFormat();
        format.setEncoding("ISO_8859_1"); 
        format.setIndent("          ");                        
        new XMLOutputter(format).output(document, new OutputStreamWriter(new FileOutputStream(new File("D:\\XMLs_creados\\Estados.xml")) , StandardCharsets.ISO_8859_1));     
    }      
}
