import java.util.Iterator; //Importo la interfaz Iterator para iterar el arrayList
import java.util. ArrayList; //Importo la clase ArrayList para poder usar la lista
import java.io.*;
import java.util.*;
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.9AF26FD9-64DC-5EC9-FA9A-854F1150E267]
// </editor-fold> 
public class Jugador {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EE398D96-3667-20DD-B24F-D25C841309FB]
    // </editor-fold> 
    private int numTerritorios;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B7902F99-FCC4-7D58-0047-FBFDFA60F0E2]
    // </editor-fold> 
    private int numEjercitos;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.FAA3F7D6-2F60-4251-3097-50A22AA16834]
    // </editor-fold> 
    private String Color;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.1B64D001-7638-F403-A50D-7D7A1AABA1DD]
    // </editor-fold> 
    private Mision mMision;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.65796419-20D6-61EA-DA56-5D363D42A0F7]
    // </editor-fold> 
    private Cartas mCartas;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.846A0DBF-260B-44B8-B8C5-3F7F43BB7D4B]
    // </editor-fold> 
    private ArrayList<Territorios> mTerritorios=new ArrayList();;
    private ArrayList<Dados> mDados=new ArrayList();
    private ArrayList<Dados> mDadosDefensa=new ArrayList();
    String cadena;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.27FCAD17-1B9B-C8D9-81A2-D43B5964C3EE]
    // </editor-fold> 
    public Jugador (String col) {
        mTerritorios=new ArrayList();
        numTerritorios=0;
        numEjercitos=0;
        setColor(col);
        Dados d1=new Dados();
        Dados d2=new Dados();
        Dados d3=new Dados();
        Dados d4=new Dados();
        Dados d5=new Dados();
        mDados.add(d1);
        mDados.add(d2);
        mDados.add(d3);
        mDadosDefensa.add(d4);
        mDadosDefensa.add(d5);
        
    }
    
    public void setTerritorios(Territorios ter){
        ter.setDueño(this);
        mTerritorios.add(ter);
    }
    public ArrayList<Territorios> getTerritorios () {
        return mTerritorios;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.16DB7B6E-237B-8068-79D1-337E6F4D181F]
    // </editor-fold> 
    public String getColor () {
        return Color;
    }
    
    public void verTerritorios(){
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        while(lista_territorios.hasNext()&& i<numTerritorios) {
        System.out.println("*"+ mTerritorios.get(i).getNombreTerritorio()+"* Ejercitos: "+mTerritorios.get(i).getnumEjercitos());
        i++;
        
        }
        
    }
    public boolean comprobarNumDados(int id,int dados){
        if (mTerritorios.get(id).getnumEjercitos()>3 && dados<=3)
            return true;
        if (mTerritorios.get(id).getnumEjercitos()==3 && dados<=2)
            return true;
        if (mTerritorios.get(id).getnumEjercitos()==2 && dados==1)
            return true;
        return false;
        
    }
    public int NumDadosDefensa(Territorios atacado){
        if (atacado.getnumEjercitos()>1)
            return 2;
        if (atacado.getnumEjercitos()==1)
            return 1;
        return 0;
        
    }
    public int maximo(ArrayList<Dados> mdados, int n_tirada){
        int maximo=0;
        for (int i=0; i<n_tirada;i++){
            if (maximo<=mdados.get(i).getValorDado())
                maximo=mdados.get(i).getValorDado();
        }
        return maximo;
            
            
    }
    public int buscarIndice(int id){
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        while(lista_territorios.hasNext()&& i<numTerritorios) {
        
            if(mTerritorios.get(i).getNumero()==id){
                return i;
            }
        i++;
        
        }
        return 0;
    }
            
    
    public void atacar(int origen, Territorios destino){
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        int dados=0,dadosdefensa=0,maxatak=0,maxdef=0;
        boolean correcto=false;
        
        
            
        while(lista_territorios.hasNext()&& i<numTerritorios) {
        if (mTerritorios.get(i).getNumero()==origen){
            correcto=true;
            if(mTerritorios.get(i).getnumEjercitos()==1)
            System.out.println("No tienes suficientes ejercitos para realizar un ataque ");
            else{
                if(mTerritorios.get(i).comprobarVecinos(destino.getNumero())==true){
            
            System.out.println("¿Con cuantos dados quiere atacar? : ");
            dados=leer(); 
            if (comprobarNumDados(i,dados)==true){
                for (int j=0;j<dados;j++){
                    mDados.get(j).Tirar();
                    System.out.println("Dado "+(j+1)+" "+ "Valor: "+mDados.get(j).getValorDado());
                }
                maxatak=maximo(mDados,dados);
                dadosdefensa=NumDadosDefensa(destino);
                for (int k=0;k<dadosdefensa;k++){
                    mDadosDefensa.get(k).Tirar();
                    System.out.println("Dado Defensa"+(k+1)+" "+ "Valor: "+mDadosDefensa.get(k).getValorDado());
                    
                }
                maxdef=maximo(mDadosDefensa,dadosdefensa);
                
                if(maxdef>=maxatak){
                mTerritorios.get(i).disNumEjercitos(1); 
                System.out.println("Pierdes ");
                }
                else{
                destino.disNumEjercitos(1);
                if(destino.getnumEjercitos()==0){
                    destino.aumNumEjercitos(1);
                    this.aumNumeroTerritorios(1);
                    mTerritorios.add(destino);
                    destino.getDueño().disNumeroTerritorios(1);
                    destino.getDueño().getTerritorios().remove(buscarIndice(destino.getNumero()));
                }
                System.out.println("Ganas ");
                }
                
            }
            else{
            System.out.println("No puede atacar con tantos dados");    
            }
                
            }
            else{
            System.out.println("Ese territorio no es vecino");     
            }
            
        }
        
        }  
        i++;
        
        }
    
        if (correcto==false)
            System.out.println("Ese territorio no es suyo");
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.276B5047-423B-245D-A3CC-ACA163B5CC2D]
    // </editor-fold> 
    public void setColor (String val) {
        Color=val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E2034AF7-0A2D-5C36-CA6B-1C0C438BDDAB]
    // </editor-fold> 
    public int getNumEjercitos () {
        return numEjercitos;
    }
    public void inicioNumEjercitos(int jugadores){
        if (jugadores==3)
            numEjercitos=35;
        if (jugadores==4)
            numEjercitos=30;
        if (jugadores==5)
            numEjercitos=25;
        if (jugadores==6)
            numEjercitos=20;
    }
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E588F783-6B18-1921-C8D9-C4C95930052F]
    // </editor-fold> 
    public void setNumEjercitos (int val) {
        numEjercitos=val;
    }
    public void disNumEjercitos (int val) {
        numEjercitos=numEjercitos-val;
    }
    public void aumNumEjercitos (int val) {
        numEjercitos=numEjercitos+val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.00DA7431-9E2C-B8A5-2493-8895F0F74244]
    // </editor-fold> 
    public int getNumTerritorios () {
        return numTerritorios;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.5E5627AD-35C0-206D-7BF3-43C0FC0439C7]
    // </editor-fold> 
    public void setNumTerritorios () {
        numTerritorios=numTerritorios+1;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.7D9460AE-E633-4B75-BB85-C0F12FDEDFEA]
    // </editor-fold> 
    public void annadirEjercito (int id, int nejer){
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        boolean correcto=false;
        if (numEjercitos<nejer)
             System.out.println("No tiene suficientes ejercitos para colocar ");
        else{
            while(lista_territorios.hasNext()&& i<numTerritorios) {
            if (mTerritorios.get(i).getNumero()==id && numEjercitos>=nejer){
                mTerritorios.get(i).aumNumEjercitos(nejer);
                disNumEjercitos(nejer);
                correcto=true;
            }
            i++;
        }
            if (correcto==false)
                System.out.println("No es dueño de ese territorio ");
                
        
        
        }
        
          
        
            
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.07048124-5DB3-CD9C-4973-F15359CB04C4]
    // </editor-fold> 
    public void TerminarTurno (){
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.1DB1328A-6303-CCFF-FD40-EB3252ED4952]
    // </editor-fold> 
    

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6FEBEFE2-E55D-CDFB-9085-07B42EAB33C8]
    // </editor-fold> 
    public Mision getMision () {
        return mMision;
    

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.7957103B-61F0-D15C-BAC2-CF2CC09E5A0D]
    // </editor-fold> 
  
    
    }
    public int leer (){
       int num=0;
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1);
        try {
            num = Integer.parseInt(br.readLine());
        }
        catch (IOException ex) {
         System.out.println(ex);
        }
       return num;
       
    
    }
    public void disNumeroTerritorios (int val) {
        numTerritorios=numTerritorios-1;
    }
    public void aumNumeroTerritorios (int val) {
        numTerritorios=numTerritorios+1;
    }
    
}

