import java.awt.Color;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList; 

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
import java.util.StringTokenizer;
// #[regen=yes,id=DCE.8F58F1B9-D2E4-E9A7-B25E-3073263F6D45]
// </editor-fold> 
public class Tablero implements Serializable{

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.2450F42A-EFAA-688A-E418-3636EC8E9712]
    // </editor-fold> 
    private ArrayList<Continente> mContinente;
    
    private ArrayList<Territorio> mTerritorios;

    /*Atributos creados por nosotros*/
    private ArrayList<CartaDeTerritorio> mCartasTerritorio;    
    private ArrayList<CartaMision> mCartasMision;
    /********************************/
    
    public Tablero (ArrayList<Continente> c)
    {
        mContinente = new ArrayList<Continente>();
        mContinente = c;
    }
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.29BBAAA2-4BC6-537B-31C2-91B78FB6164D]
    // </editor-fold> 

    public Tablero () 
    {        
        FileReader fich = null;
        BufferedReader buffer = null;
        
        mContinente = new ArrayList();
        mTerritorios = new ArrayList<Territorio>();        
        mCartasTerritorio = new ArrayList<CartaDeTerritorio>();
        
        int continenteActual = 0;
        int contadorIdTerritorio = 1;
        
        try
        {            
            String nombreFichero = "src/Tablero.txt";
            String nombreFicheroPrueba = "src/TableroPruebas.txt";
            
            fich = new FileReader(nombreFicheroPrueba);
            buffer = new BufferedReader(fich);
             
            String linea;            
            
            while ((linea=buffer.readLine()) != null)
            {
                if (linea.contains("<Continente>"))
                {                        
                    String nombreContinente = buffer.readLine();
                    Continente c = new Continente(nombreContinente.trim());
                    c.setArmadasPorSerConquistado(Integer.parseInt(buffer.readLine()));
                    mContinente.add(c);
                    System.out.println(c.getNombre());
                    continenteActual++;
                }
                else if (linea.contains("<Territorio>"))
                {              
                    //String id = buffer.readLine();                            
                    String nombreTerritorio = buffer.readLine();                    
                    Territorio t = new Territorio(nombreTerritorio.trim());                    
                    t.setId(contadorIdTerritorio);
                    t.setNumEjercitos(1);
                    contadorIdTerritorio++;
                    mTerritorios.add(t);
                    System.out.println(t.getNombre());
                    /*El "-1" es para corregir el exceso que se crea en la inicializacion 
                     de la vaiable continenteActual*/
                    mContinente.get(continenteActual-1).setTerritorio(t); 
                    
                    /*Creamos la carta*/
                    String armadaCarta = buffer.readLine();                    
                    //System.out.println("Armada: "+armadaCarta.trim()+" Valor: "+valorArmadaCarta.trim());
                    CartaDeTerritorio carta = new CartaDeTerritorio(t, armadaCarta.trim());
                    setMCartasTerritorio(carta);                       
                }                
                else if(linea.contains("<Colindante>"))
                {
                    //System.out.println("Colindantes entre si");                    
                    
                    /*Localizamos el territorio origen dentro del array*/
                    String tOrigenNombre = buffer.readLine();
                    Territorio tOrigen = buscarTerritorio(tOrigenNombre);
                    //System.out.println("Territorio Origen "+tOrigen.getNombre());
                    
                    if (tOrigen != null)
                    {                                      
                        /*Definnimos un delimitador*/
                        StringTokenizer st = new StringTokenizer(buffer.readLine(),":");
                        while (st.hasMoreTokens())
                        {
                            Territorio tPivote = buscarTerritorio(st.nextToken());
                            tOrigen.setTerritorio(tPivote);
                            //System.out.println("Colindante: "+tPivote.getNombre());
                        }
                    }
                }
            }
            
            
            System.out.println("Listado Mapa:");            
            for (int i=0; i<mContinente.size(); i++)
            {
                System.out.println(mContinente.get(i).getNombre());                
                for (int j=0; j<mContinente.get(i).getTerritorio().size(); j++)                                     
                {
                    System.out.println(mContinente.get(i).getTerritorio().get(j).getId() + " - " + mContinente.get(i).getTerritorio().get(j).getNombre());
                    for (int k=0; k<mContinente.get(i).getTerritorio().get(j).getTerritorio().size(); k++)
                        System.out.println("    Colinda: " + mContinente.get(i).getTerritorio().get(j).getTerritorio().get(k).getNombre());
                }                    
            }
            
            /*Creamos las cartas de mision tambien*/
           crearCartasMision();
            
            /*Intentamos cerrar el fichero*/
            try
            {
                fich.close();        
            }
            catch (IOException error)
            {
                System.out.println(error.getMessage());
            }
                                
        }
        catch(Exception error){
            System.out.println(error.getMessage());
            //Exception e = new Exception("No se puede abrir el archivo para crear el Tablero");
        }                                                
        //setContinente(mContinente);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.C2660C05-D842-1812-83B2-B55F3305666D]
    // </editor-fold> 
    public ArrayList<Continente> getContinente () {
        return mContinente;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.287ABE6A-69CF-100F-0B0A-57E2030C506C]
    // </editor-fold> 
    public void setContinente (ArrayList<Continente> val) {
        this.mContinente = val;
    }
    
    public ArrayList<Territorio> getTerritorio () {
        return mTerritorios;
    }


    public void setTerritorio (ArrayList<Territorio> val) {
        this.mTerritorios = val;
    }
    
    public ArrayList<CartaDeTerritorio> getMCartasTerritorio() {
        return mCartasTerritorio;
    }

    public void setMCartasTerritorio(ArrayList<CartaDeTerritorio> mCartasTerritorio) {
        this.mCartasTerritorio = mCartasTerritorio;
    }
    
    public void setMCartasTerritorio(CartaDeTerritorio CartaTerritorio) 
    {
        this.getMCartasTerritorio().add(CartaTerritorio);
    }
    
    public ArrayList<CartaMision> getMCartasMision() {
        return mCartasMision;
    }

    public void setMCartasMision(ArrayList<CartaMision> mCartasMision) {
        this.mCartasMision = mCartasMision;
    }
    
    /*Método que pasado un nombre de Territorio por parametro, devuele el objeto trerritorio que
     coincide con ese nombre. En caso de no encontrarlo devuelve null*/
    public Territorio buscarTerritorio(String nombre)
    {
        /*Recorremos el array buscando un territorio cuyo nombre sea el indicado*/
        //System.out.println("    " +nombre);
        for (int i=0; i<mTerritorios.size(); i++)        
        {
            if (mTerritorios.get(i).getNombre().equals(nombre))
                return mTerritorios.get(i);
        }                
        return null;
    }   
    
    public Continente buscarContinente(String nombre)
    {
        /*Recorremos el array buscando un territorio cuyo nombre sea el indicado*/
        //System.out.println("    " +nombre);
        for (int i=0; i<mContinente.size(); i++)        
        {
            if (mContinente.get(i).getNombre().equals(nombre))
                return mContinente.get(i);
        }                
        return null;
    }
    
    private void crearCartasMision()
    {
        /*Creamos cada carta a mano ya que solo son 4 grupos de cartas*/                        
        mCartasMision = new ArrayList<CartaMision>();
        mCartasMision.add(new CartaMision("24Territorios", "Ocupar"));
        mCartasMision.add(new CartaMision("18Territorios", "Ocupar"));        
        mCartasMision.add(new CartaMision("Asia-America del Sur", "ConquistarContinentes"));
        mCartasMision.add(new CartaMision("Asia-Africa", "ConquistarContinentes"));
        mCartasMision.add(new CartaMision("America del Norte-Africa", "ConquistarContinentes"));
        mCartasMision.add(new CartaMision("America del Norte-Australasia", "ConquistarContinentes"));        
        //mCartasMision.add(new CartaMision("Europa-AmericaSur-Oceania", "ConquistarContinentes"));
        mCartasMision.add(new CartaMision(Color.RED.toString(), "Destruir"));
        mCartasMision.add(new CartaMision(Color.BLUE.toString(), "Destruir"));
        mCartasMision.add(new CartaMision(Color.GREEN.toString(), "Destruir"));
        mCartasMision.add(new CartaMision(Color.ORANGE.toString(), "Destruir"));
        mCartasMision.add(new CartaMision(Color.YELLOW.toString(), "Destruir"));
        mCartasMision.add(new CartaMision(Color.PINK.toString(), "Destruir"));
    }
    
    /*Este metodo nos devuelve una carta del array de cartas de territorios y la elimina del array*/
    public CartaDeTerritorio devolverCarta ()
    {
        if(mCartasTerritorio.size() > 0)
        {
            CartaDeTerritorio c = mCartasTerritorio.get(0);
            mCartasTerritorio.remove(0);
            return c;
        }
        else
            return null;
    }
    
}