package riskuhujava;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
import java.util.Iterator;
// #[regen=yes,id=DCE.1A6F0223-0D76-4421-CDF3-21381FD295C8]
// </editor-fold> 
public class Jugador {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.949E565B-A1CA-9589-0AE9-6482025EE0B5]
    // </editor-fold> 
    private int numTerritorios=0;
    private ArrayList<CartaTerritorio> mCartaTerritorio=new ArrayList();

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.4E901FC9-53EB-6941-2AC7-5E5356F7A609]
    // </editor-fold> 
    private CartaMision mCartaMision;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.4AD95749-8361-D52B-7689-D8833629BD73]
    // </editor-fold> 
    private ArrayList<Movimiento> mMovimiento=new ArrayList();
    
    private int ejercitosPendientes=0;
    
    private int idJugador;

    private ArrayList<Territorio> mTerritorio=new ArrayList();
    
  
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B46429D8-7320-8E2B-8EC2-7685F0259621]
    // </editor-fold> 
    public Jugador (int val) {
        idJugador=val;
    }
    
    public int getIdJugador(){
        return idJugador;
    }
    
    public void setIdJugador(int val){
        idJugador=val;
    }
    
    public int getEjercitosPendientes(){
        return ejercitosPendientes;
    }
    public void setEjercitosPendientes(int val){
        ejercitosPendientes=val;
    }
    
    public int getNumTerritorios(){
        return numTerritorios;
    }
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.2689C914-610E-C113-ED64-C1130D86CC67]
    // </editor-fold> 
    public CartaMision getCartaMision () {
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.795881C9-0363-19E6-4207-046FF4344378]
    // </editor-fold> 
    public void setCartaMision (CartaMision val) {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.1C1F4A46-9A4D-0E14-5BDF-AA3FA14FC727]
    // </editor-fold> 
    public ArrayList<CartaTerritorio> getCartaTerritorio () {
        return mCartaTerritorio;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.E81E2B79-632F-263D-3EDA-DE471ED1A885]
    // </editor-fold> 
    public void setCartaTerritorio (ArrayList<CartaTerritorio> val) {
        mCartaTerritorio=val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6A26C199-4D85-57D6-ADF7-DE5A3DEEC58E]
    // </editor-fold> 
    public ArrayList<Movimiento> getMovimiento () {
        return mMovimiento;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.463FBC7C-88F4-0CBC-C966-820B4951F332]
    // </editor-fold> 
    public void setMovimiento (ArrayList<Movimiento> val) {
        mMovimiento=val;
    }
    
    public ArrayList<Territorio> getTerritorio (){
        return mTerritorio;
    }
    
    public void setTerritorio (ArrayList<Territorio> val){
        mTerritorio=val;
    }
    
    public void addTerritorio (Territorio t){
        mTerritorio.add(t);
        numTerritorios++;
    }
    
    //Comprueba si está en la lista de territorios de un jugador un territorio
    //con un determinado identificador
    
    public boolean esta (int id){
        boolean valor=false;
        
        Iterator itt=mTerritorio.iterator();
        Territorio t;
        
        while (itt.hasNext()){
            t=(Territorio) itt.next();
            if (t.getIdTerritorio()==id)
                valor=true;
        }
        
        return valor;
    }
   //Devuelve el territorio que tiene un determinado id
    public Territorio dameTerritorio(int id){
        Iterator itt=mTerritorio.iterator();
        Territorio t,encontrado = null;
        
        while (itt.hasNext()){
            t=(Territorio) itt.next();
            if (t.getIdTerritorio()==id)
                encontrado=t;
        }
        
        return encontrado;
    }
    //Actualiza un la lista de territorios
    public void actualiza(Territorio t,int id){
        Iterator itt=mTerritorio.iterator();
        Territorio[] tterritorio=new Territorio[numTerritorios];
        int i=0,posicion=0;
        
        //Meto la lista en una tabla
        while (itt.hasNext()){
            tterritorio[i]=(Territorio) itt.next();
            i++;
        }
        
        //Recorro la tabla buscando el territorio con identificador id
        
        for(i=0;i<this.numTerritorios;i++){
            if (tterritorio[i].getIdTerritorio()==id){
                posicion=i;
            }
        }
        
        tterritorio[posicion]=t;
        ArrayList<Territorio> te=new ArrayList();
        
        for (i=0;i<this.numTerritorios;i++)
            te.add(tterritorio[i]);
        mTerritorio=te;
        
    }
    
    //Comprueba si dos territorios son vecinos
    boolean vecinos (Territorio t1,Territorio t2){
        boolean valor=false;
        
        
        return valor;
    }
    public void UbicarTropas() throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        Iterator itt=mTerritorio.iterator();
        Territorio t,buscado;
        boolean mio=false,correcto=false;
        int numTerr = 0;
        int tropas=0;
        
        if (ejercitosPendientes==0)
            System.out.println("Usted no puede ubicar ningúna tropa.");
        else{
            while (ejercitosPendientes>0){
                //Primero comprobamos que el territorio seleccionado pertenece al jugador
                while (mio==false){
                    System.out.println("Seleccione uno de sus territorios introduciendo su identificador:");
                    while (itt.hasNext()){
                        t=(Territorio) itt.next();
                        System.out.println("Territorio "+t.getIdTerritorio()+": "+t.getnombre());
                    
                    }
                    numTerr = Integer.parseInt(in.readLine( ));
                    mio=esta(numTerr);
                    if (mio==false) System.out.println("El territorio que ha seleccionado no le pertenece.");
                }
                
                //Comprobamos que no se pretende ubicar más ejércitos de los que se dispone
                while (correcto==false)
                {
                    System.out.println("Introduzca el número de tropas que desea ubicar en el territorio seleccionado:");
                    int numero = Integer.parseInt(in.readLine( ));
                    
                    if (numero<=ejercitosPendientes)
                    {
                        correcto=true;
                        ejercitosPendientes=ejercitosPendientes-numero;
                        buscado=this.dameTerritorio(numTerr);   //devuelve el territorio con identificador numTerr
                        tropas=buscado.getNumTropas();      //Sumo las tropas que he ubicado
                        tropas=tropas+numero;
                        buscado.setNumTropas(tropas);
                        this.actualiza(buscado,numTerr);    //actualizo la lista de territorios
                    }
                }//fin while
                
                                
            }//fin while
        }//fin else
    }//fin ubicar
    
    public void atacar () throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        Iterator itt=mTerritorio.iterator();
        Territorio t;
        int numT = 0;
        boolean mio,correcto=false,esta=false,bien=false;
        Territorio atacante = null,atacado;
        ArrayList<Territorio> vecinos = null; 
        Iterator itv=vecinos.iterator();
        int numAt=0;
        ArrayList identificadores=new ArrayList();
        Iterator iti=identificadores.iterator();
        int tropasAtacante,tropasAtaque;
        
        
        //Primero comprobamos que el territorio desde el que deseamos atacar pertenece al gugador
        
        while (correcto==false)
        {
            System.out.println("Introduzca el identificador del territorio desde el que desea atacar: ");    
            //Imprimimos por pantalla la lista de territorios del jugador
            while (itt.hasNext()){
                        t=(Territorio) itt.next();
                        System.out.println("Territorio "+t.getIdTerritorio()+": "+t.getnombre());
                    
            }
            numT = Integer.parseInt(in.readLine( ));
            mio=this.esta(numT);    //compruebo que el territorio sea del jugador
            if (mio) {
                correcto=true;
                atacante=this.dameTerritorio(numT);
                vecinos=atacante.getTerritoriosVecinos();
                //Ahora comprobamos que el territorio al que se desea ataca es correcto
                while (bien==false){
                         System.out.println("Introduzca el identificador del territorio al que desea atacar:");
                        //Imprimimos por pantalla la lista de territorios vecino que no son del jugador
                        while (itv.hasNext()){
                            t=(Territorio) itv.next();
                            mio=this.esta(t.getIdTerritorio());
                            if(mio==false){
                                numAt++;
                                System.out.println("Territorio "+t.getIdTerritorio()+": "+t.getnombre());
                                //creo una lista con los identificadores de los territorios a los que puedo atacar
                                identificadores.add(t.getIdTerritorio());
                            }       
                            
                        }
                 }
                 if (numAt==0){
                    correcto=false;
                    System.out.println("Usted no puede atacar a ningún territorio con el territorio seleccionado.");
                }
                else{
                       numT = Integer.parseInt(in.readLine( ));
                       //compruebo que el identificador introducido se encuentra entre la lista
                       //para corroborar que ambos territorios son vecinos
                        while (iti.hasNext()){
                            t=(Territorio) iti.next();
                             if (t.getIdTerritorio()==numT)
                                esta=true;
                        }
                        if (esta==true) {
                            bien=true;
                            atacado=this.dameTerritorio(numT);
                        }
                }
        
             
            }
            else System.out.println("Ese territorio no le pertenece, introduzca otro.");
        }
        
        //Comprobamos que el número de tropas con las que se desea atacar el
        //territorio es correcto
        tropasAtacante=atacante.getNumTropas();
        if (tropasAtacante<2)
            System.out.println("No tiene suficientes tropas en esta territorio para atacar.");
        else{
            
            correcto=false;
            while (correcto==false){
                 System.out.println("Introduzca el número de tropas con el que desea atacar(disponibles "+tropasAtacante+"):");
                 tropasAtaque = Integer.parseInt(in.readLine( ));
                 if (tropasAtaque<tropasAtacante)
                     correcto=true;
                 else System.out.println("Número incorrecto.");
            }
           
        }
        
        
    }//fin atacar

}//fin clase jugador

