
import java.io.*;
import java.util.*;
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.IOException;
import java.util.Observable;
import javax.swing.*;
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.9AF26FD9-64DC-5EC9-FA9A-854F1150E267]
// </editor-fold> 
public class Jugador extends Observable {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EE398D96-3667-20DD-B24F-D25C841309FB]
    // </editor-fold> 
    private int numTerritorios;
    private String nombre;
    // <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;
    private ArrayList<Dados> mDadosDefensa;
    String cadena;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.27FCAD17-1B9B-C8D9-81A2-D43B5964C3EE]
    // </editor-fold> 
    public Jugador (String nom,String col) {
        nombre=nom;
        mTerritorios=new ArrayList();
        numTerritorios=0;
        numEjercitos=0;
        setColor(col);
        mDados=new ArrayList();
        mDadosDefensa=new ArrayList();
        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 Rearmamiento(Tablero t){
     
     int nuevosEjercitos=0;
     nuevosEjercitos=mTerritorios.size()/3;
     System.out.println("Rearmamiento territorios: "+nuevosEjercitos);
     nuevosEjercitos=nuevosEjercitos+this.rearmamientoContinentes(t);
      
     this.setNumEjercitos(nuevosEjercitos);
     }
     
    public int rearmamientoContinentes(Tablero t){
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        int contadorPaises0=0,contadorPaises1=0,contadorPaises2=0,contadorPaises3=0,contadorPaises4=0,contadorPaises5=0;
        int ejercitos=0;
        while(lista_territorios.hasNext()&& i<numTerritorios) {
        
        if (t.getContinentes().get(0).getTerritorios().contains(mTerritorios.get(i))==true)
            contadorPaises0++;
        if (t.getContinentes().get(1).getTerritorios().contains(mTerritorios.get(i))==true)
            contadorPaises1++;
        if (t.getContinentes().get(2).getTerritorios().contains(mTerritorios.get(i))==true)
            contadorPaises2++;
        if (t.getContinentes().get(3).getTerritorios().contains(mTerritorios.get(i))==true)
            contadorPaises3++;
        if (t.getContinentes().get(4).getTerritorios().contains(mTerritorios.get(i))==true)
            contadorPaises4++;
         if (t.getContinentes().get(5).getTerritorios().contains(mTerritorios.get(i))==true)
            contadorPaises5++;
        i++;
        
        }
        if(contadorPaises0==12)
            ejercitos=ejercitos+7;
        if(contadorPaises1==4)
            ejercitos=ejercitos+2;
        if(contadorPaises2==6)
            ejercitos=ejercitos+3;
        if(contadorPaises3==7)
            ejercitos=ejercitos+5;
        if(contadorPaises4==4)
            ejercitos=ejercitos+2;
        if(contadorPaises5==9)
            ejercitos=ejercitos+5;
        System.out.println("Rearmamiento Continentes: "+ejercitos);
        return ejercitos;
    }
    public void verTerritorios(JframeTablero j){
        DefaultListModel modelo = new DefaultListModel();  
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        while(lista_territorios.hasNext()&& i<numTerritorios) {
        modelo.addElement(mTerritorios.get(i).getNombreTerritorio()+"            Ejercitos: "+mTerritorios.get(i).getnumEjercitos());
        System.out.println("*"+ mTerritorios.get(i).getNombreTerritorio()+"* Ejercitos: "+mTerritorios.get(i).getnumEjercitos());
        i++;
        
        }
        j.setJListTerritorios(modelo);
        
    }
    public static ArrayList ordenar(ArrayList<Dados> d) {
		
		Dados aux;
        for (int i = 0; i < d.size(); i++) {
            for (int j = i; j < d.size(); j++) {
                if (d.get(i).getValorDado() < d.get(j).getValorDado()) {
                    aux = d.get(j);
                    d.set(j, d.get(i));
                    d.set(i, aux);
                }
            }
        }
		
		return d;
	}
    
    private void compararDados(Territorios origen, Territorios destino, ArrayList<Dados> dadoAtac, ArrayList<Dados> dadoDef) {
        System.out.println(origen.getNombreTerritorio()+"  vs.  "+destino.getNombreTerritorio());
       
       
        for (int i = 0; i < dadoAtac.size(); i++) {
            if (i < dadoDef.size()&&(destino.getnumEjercitos()>0)&&(origen.getnumEjercitos()>1)) {
               
                if ((dadoAtac.get(i).getValorDado()) > (dadoDef.get(i).getValorDado())) {
                    System.out.println("Dado " + (i + 1) + ": " + dadoAtac.get(i).getValorDado() + " - " + dadoDef.get(i).getValorDado() + ". Gana ataque");
                    destino.disNumEjercitos(1);
                } else {
                    if (dadoAtac.get(i).getValorDado() == dadoDef.get(i).getValorDado()) {
                        System.out.println("Dado " + (i + 1) + ": " + dadoAtac.get(i).getValorDado() + " - " + dadoDef.get(i).getValorDado() + ". Gana defensa");
                        origen.disNumEjercitos(1);
                    } else {
                        System.out.println("Dado " + (i + 1) + ": " + dadoAtac.get(i).getValorDado() + " - " + dadoDef.get(i).getValorDado() + ". Gana defensa");
                        origen.disNumEjercitos(1);
                    }
                }
            }
            else{
                System.out.println("Dado "+(i+1)+": "+dadoAtac.get(i).getValorDado());
            }
        }
    }
    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;
       */
        ArrayList lista=new ArrayList();
       for (int i=0; i<n_tirada;i++){
            lista.add(mdados.get(i).getValorDado()); 
       }
        Collections.sort(lista);
        Collections.reverse(lista);
        for (int i=0; i<n_tirada;i++){
           System.out.println(lista.get(i));
       }
        return 0;
    }
    public int buscarIndice(Territorios destino){
        int id=destino.getNumero();
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        while(lista_territorios.hasNext()&& i<destino.getDueño().getNumTerritorios()) {
        
            if(destino.getDueño().getTerritorios().get(i).getNumero()==id){
                return i;
            }
        i++;
        
        }
        return 0;
    }
     
    public Territorios buscarTerritorio(int id){
        
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        while(lista_territorios.hasNext()&& i<this.getNumTerritorios()) {
        
            if(this.getTerritorios().get(i).getNumero()==id){
                return this.getTerritorios().get(i);
            }
        i++;
        
        }
       return null;
    }
            
    public void moverTropas(Territorios origen,Territorios destino,int cantidad){
        if(origen.comprobarVecinos(destino.getNumero())==true){
        if (origen.getnumEjercitos()>cantidad &&this.getTerritorios().contains(origen)==true &&this.getTerritorios().contains(destino)==true){
            origen.disNumEjercitos(cantidad);
            destino.aumNumEjercitos(cantidad);
        }
        else{
        System.out.println("No se puede realizar el traslado de tropas");
        }
        }
        else
        System.out.println("No es un territorio vecino");
    }
            
    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);
                mDados=ordenar(mDados);
                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());
                    
                }
                 mDadosDefensa=ordenar(mDadosDefensa);
                //maxdef=maximo(mDadosDefensa,dadosdefensa);
                compararDados(mTerritorios.get(i), destino, mDados, mDadosDefensa);
             /*    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().getTerritorios().remove(buscarIndice(destino));
                    destino.getDueño().disNumeroTerritorios(1);
                    
                }
               // 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>=2)&&(jugadores<4))
            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=numEjercitos+val;
        setChanged();
        notifyObservers();
    }
    public void disNumEjercitos (int val) {
        numEjercitos=numEjercitos-val;
        setChanged();
        notifyObservers();
    }
    public void aumNumEjercitos (int val) {
        numEjercitos=numEjercitos+val;
        setChanged();
        notifyObservers();
    }

    // <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;
    }

    
     public int annadirEjercitoG (int id, int nejer){
        Iterator lista_territorios = mTerritorios.iterator();
        int i =0;
        
        if (numEjercitos<nejer)
            return 1; 
           // 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);
                System.out.println(mTerritorios.get(i).getNombreTerritorio()+" "+mTerritorios.get(i).getnumEjercitos());
                return 0;
               }
             i++;
            }
            
        System.out.println("No es dueño de ese territorio ");
        return 2;
       }
     }

    // <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;
        setChanged();
        notifyObservers();
       
    }
    public void aumNumeroTerritorios (int val) {
        numTerritorios=numTerritorios+1;
        setChanged();
        notifyObservers();
        
    }
    public String getNombre(){
        return nombre;
    }
    
}

