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.util.Observable;
import java.io.*;
import java.util.*;
import java.util.Random;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.F0CE4925-3F0E-D285-07DC-6B057EF93111]
// </editor-fold> 
public class Partida extends Observable {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B91B3CB9-21E5-3CE3-4ED0-A6206C678AD4]
    // </editor-fold> 
    int num; //Variable para leer desde teclado
   
    
    
    private boolean inicioTerritorios;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.274F8437-4CB0-3DF0-456E-C93A0E6AE8B8]
    // </editor-fold> 
    private int Derrota;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.CD823F63-14AA-CF1D-A86C-33AF66B48D54]
    // </editor-fold> 
    private ArrayList<Jugador> mJugador;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E7297EC0-09DC-B480-DA9B-FBA181BDF696]
    // </editor-fold> 
    private Tablero mTablero;
    private JframeTablero Jframe;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.336B1A30-6164-11E9-A31A-B2A9DC1D9BA9]
    // </editor-fold> 
    private Dados mDados;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B01C6725-CFAD-9CE4-B46A-72DF987DBB7A]
    // </editor-fold> 
    private Partida mPartida;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.DB6CA9C9-ABCA-30B8-267A-0C8E5B493CA3]
    // </editor-fold> 
    private Dados mDados1;
    private int NumJugadores;
    private int jugadorActivo;
    /**
     *  Jugadores del turno
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.F1551984-BD2C-5DF4-4439-56D8D75409E6]
    // </editor-fold> 
    public Partida (ArrayList<Jugador> m,Tablero tab,JframeTablero j) {
     Random rnd=new Random();
     jugadorActivo=rnd.nextInt(m.size());
     Jframe=j;
     NumJugadores=m.size();
     mJugador = new ArrayList();
     mJugador=m;
     mTablero=tab;
    
     /*
     int opc=0;
     while(opc!=4){
            System.out.println(" ");
            System.out.println("Juego del RISK");
            System.out.println("--------------");
            System.out.println("    1. Nueva Partida");
            System.out.println("    2. Cargar Partida");
            System.out.println("    3. Guardar Partida");
            System.out.println("    4. Salir Partida");
            System.out.println("Elegir opción: ");
            
            opc=leer();
            System.out.println("El numero es " +opc);
            switch (opc){
             case 1:   
                // if (mTablero.getTerritorios().get(12).validarAtaque(22)==true)
                // System.out.println(mTablero.getTerritorios().get(12).getNombreTerritorio()+" Es Vecino de: "+mTablero.getTerritorios().get(22-1).getNombreTerritorio());    
                 NuevaPartida();
                 
             break;
             case 2:
                 CargarPartida();
             break;
             case 3:
                 GuardarPartida();
             break;
             case 4:
                 SalirPartida();
             break;
             default: System.out.println("No es una opción válida!");
             break;
            }
              
     }
*/
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E9602A53-886C-CB97-091A-D56F415C1C91]
    // </editor-fold> 
    public void Jugar (int modalidad) {
        System.out.println("Según modalidad aqui se darian una serie de datos importantes");
        boolean Fin=false;
        int i=0;
        int ter=0,teratak1=0,teratak2=0,ejer=0;
        Jframe.setFocusCycleRoot(true);
        repartirEjercitos();
        repartirTerritorios();
        
        
        
        while(Fin!=true){
            Iterator lista_jugadores = getMJugador().iterator();
        while(lista_jugadores.hasNext()) {
                getMJugador().get(i).Rearmamiento(mTablero);
            String opc="";
            while(!opc.equals("7")){
            System.out.println(" ");
            System.out.println("Turno de: "+getMJugador().get(i).getColor());
            System.out.println("--------------");
            System.out.println("    1. Colocar Ejercitos");
            System.out.println("    2. Atacar");
            System.out.println("    3. Mover tropas");
            System.out.println("    4. Ver Cartas");
            System.out.println("    5. Ver Mis Territorios");
            System.out.println("    6. Ver Mis Ejercitos Pendientes");
            System.out.println("    7. Terminar Turno");
            System.out.println("    8. Terminar Partida ");
            System.out.println("Elegir opción: ");
            opc=leerCadena();
            
            switch (opc.hashCode()){
                case '1':
                    
                    System.out.println("Seleccione el territorio");
                    ter=leer();
                    System.out.println("Cuantos Ejercitos? ");
                    ejer=leer();
                    getMJugador().get(i).annadirEjercito(ter,ejer);
                    
                        
                   
                    break;
                case '2':
                    System.out.println("Seleccione su territorio");
                    teratak1=leer();
                    System.out.println("Seleccione el territorio que quiere invadir");
                    teratak2=leer();
                    getMJugador().get(i).atacar(teratak1,mTablero.getTerritorios().get(teratak2-1));
                    break;
                case '3':
                    System.out.println("Seleccione su territorio");
                    teratak1=leer();
                    System.out.println("Cuantas tropas quiere trasladar?");
                    ejer=leer();
                    System.out.println("Seleccione el territorio al que quiere mover las tropas");
                    teratak2=leer();
                    if(getMJugador().get(i).buscarTerritorio(teratak1)==null){
                        System.out.println("El territorio origen no es suyo");
                    }else
                    {
                    if( getMJugador().get(i).buscarTerritorio(teratak2)==null){
                        System.out.println("El territorio destino no es suyo");
                    }
                    else{
                            getMJugador().get(i).moverTropas(getMJugador().get(i).buscarTerritorio(teratak1), getMJugador().get(i).buscarTerritorio(teratak2), ejer);
                    }
                    }
                    break;
                case '4':
                    System.out.println("Aqui se verian las cartas del jugador ");
                    break;
                case '5':
                    //getMJugador().get(i).verTerritorios();
                    break;
                case '6':
                    System.out.println("Ejercitos Pendientes: " +getMJugador().get(i).getNumEjercitos());
                    break;
                case '7':
                   System.out.println("El jugador a terminado el turno");
                    break;
                case '8':
                    SalirPartida ();
                    break;
             default: System.out.println("No es una opción válida!");
                    break;
            }
            
            
            }
            if(i==NumJugadores-1){
                i=0;
                
            }
            else
                i++;
            

        }
        }

       
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.25DC8A19-D421-0362-AC24-380A8DA2FA3B]
    // </editor-fold> 
    public int getDerrota () {
        return 0;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.80102F7C-78D4-F1FA-93CD-FA6A9D3B4814]
    // </editor-fold> 
    public void setDerrota (int val) {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.8BBEC06B-3E59-80FC-F32E-706394AFBCCB]
    // </editor-fold> 
    public char getModalidad () {
        return 'a';
    }

    

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.ACB60142-E4BE-FB1D-F0C0-4DE6C20A1437]
    // </editor-fold> 
    public Jugador getTurno () {
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.09D88742-F140-5F70-EA97-73B98BA1FC8F]
    // </editor-fold> 
    public void setTurno (Jugador val) {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.47A35DBE-11EE-53D5-B483-0DB246655257]
    // </editor-fold> 
    public void CargarPartida () {
        System.out.println("Aqui se cargaría una partida guardada ");
        System.out.println("En proceso de creación ");
        
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.ACA73C7C-FB55-C37D-EC34-A628A4075846]
    // </editor-fold> 
    public void GuardarPartida () {
        System.out.println("Aqui se guardaría una partida  ");
        System.out.println("En proceso de creación ");
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.6EEC388C-67A8-8B76-0957-DD421FAF2FCF]
    // </editor-fold> 
    public void SalirPartida () {
        System.out.println("Fin de partida ");
        System.exit(1);
       
        
    }
    public void repartirEjercitos(){
        Iterator lista_jugadores = getMJugador().iterator();
        int i =0;
        while(lista_jugadores.hasNext()&&i<NumJugadores) {
            getMJugador().get(i).inicioNumEjercitos(NumJugadores); 
        i++;
        }
    }
    public int repartirTerritoriosG(int id){
        if(getInicioTerritorios()==true){
            if(mTablero.territorioLibre()==false){
               
                    setInicioTerritorios(false);
                    return 1;
                    }
       
        else{
             if (mTablero.getTerritorios().get(id-1).getLibre()==true ){
            mTablero.getTerritorios().get(id-1).setLibre(false);
            mTablero.getTerritorios().get(id-1).setnumEjercitos(1);
                    getMJugador().get(getJugadorActivo()).setTerritorios(mTablero.getTerritorios().get(id-1));
                    getMJugador().get(getJugadorActivo()).setNumTerritorios();
                    getMJugador().get(getJugadorActivo()).disNumEjercitos(1);
                    pasarTurno();
                    
                    return 0;
          }
            else
            
                return 2;
            
        }
        
        }
        return 0;
    }
    public void repartirTerritorios () {
        Iterator lista_jugadores = getMJugador().iterator();
        int i =0;
        int id=0;
        while(lista_jugadores.hasNext() && mTablero.territorioLibre()==true) {
        boolean correcto=true;    
        do{    
        System.out.println("Elige un territorio jugador "+getMJugador().get(i).getColor());
        id=leer();
        
        if (mTablero.getTerritorios().get(id-1).getLibre()==true){
            mTablero.getTerritorios().get(id-1).setLibre(false);
            mTablero.getTerritorios().get(id-1).setnumEjercitos(1);
                    getMJugador().get(i).setTerritorios(mTablero.getTerritorios().get(id-1));
                    getMJugador().get(i).setNumTerritorios();
                    getMJugador().get(i).disNumEjercitos(1);
            correcto=true;
        }
        else{
            System.out.println("Este territorio ya tiene dueño ");
            correcto=false;
        }
        }while(correcto==false);   
            
        
        
        if(i==NumJugadores-1){
          i=0;
          }
        else
          i++;
            
        }
   }
    


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.FC6A4E65-A354-BF3E-61C8-4C30D8C64B49]
    // </editor-fold> 
    public void NuevaPartida () {
        //Aqui le decimos los datos de la partida nueva
        /*Número de Jugadores
          Modalidad de Juego
         */
       int opcm;
        System.out.println("Elegir modalidad");
        System.out.println("    1. Dominación");
        System.out.println("    2. Mision");
        System.out.println("    3. Capital");
        System.out.println("Elegir opción: ");
        opcm=leer();
        System.out.println("El numero es " +opcm);
        switch (opcm){
             case 1:
                 
                 Jugar(1);  //Jugar en modo dominacion
             break;
             case 2:
                 Jugar(2);  //Jugar en modo mision
             break;
             case 3:
                 Jugar(3);  //Jugar en modo Capital
             break;
            
             default: System.out.println("No es una opción válida!");
             break;       
        }
        
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.6F9E2AF0-DC00-3B26-A9BD-A2FC5684B84B]
    // </editor-fold> 
    public int leer (){
        
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1);
        try {
            num = Integer.parseInt(br.readLine());
        }
        catch (IOException ex) {
         System.out.println(ex);
        }
       return num;
       
    
    }
    
     

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.8C728FCB-7554-1568-1D8C-5C6E4AC739C0]
    // </editor-fold> 
    public Dados getDados () {
        return mDados;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.145A064C-36BB-A1E0-E3F8-C3CA8C7B54C5]
    // </editor-fold> 
    public void setDados (Dados val) {
        this.mDados = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.AF703D4A-FC3D-2B42-B81B-6563F1DA812A]
    // </editor-fold> 
    public Dados getDados1 () {
        return mDados1;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.016231C0-553F-C686-27C8-673083EB67CE]
    // </editor-fold> 
    public void setDados1 (Dados val) {
        this.mDados1 = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6FEB6A73-5061-7F2E-EFDA-DF8289297825]
    // </editor-fold> 
    public ArrayList<Jugador> getJugador () {
        return getMJugador();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.198B54F1-8930-241B-F79F-38357F4DD2F4]
    // </editor-fold> 
    public void setJugador (ArrayList<Jugador> val) {
        this.mJugador = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.0AA5612C-CE55-6178-D888-EE428B3F3658]
    // </editor-fold> 
    public Partida getPartida () {
        return mPartida;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.265CDB25-AF35-85C4-27F9-B740C364413D]
    // </editor-fold> 
    public void setPartida (Partida val) {
        this.mPartida = val;
    }
    public String leerCadena (){
       String cadena="";
      
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1);
        try {
            cadena =br.readLine();
        }
        catch (IOException ex) {
         System.out.println(ex);
        }
       return cadena;
       
    
    }

    public int getJugadorActivo() {
        return jugadorActivo;
    }

    public void setJugadorActivo(int jugadorActivo) {
        this.jugadorActivo = jugadorActivo;
    }
    public void asignarTurno(){
        getMJugador().size();
        
    }
    public int getNumJugadores(){
        return NumJugadores;
    }

    public ArrayList<Jugador> getMJugador() {
        return mJugador;
    }
    public void pasarTurno2(){
        
        if (getJugadorActivo()==getNumJugadores()-1)
        {
            setJugadorActivo(0);            
        }
        else
            {            
            setJugadorActivo(getJugadorActivo()+1);   
            }
        setChanged();
        notifyObservers();
         }
    public void pasarTurno(){
        
        if (getJugadorActivo()==getNumJugadores()-1)
        {
            setJugadorActivo(0);            
        }
        else
            {            
            setJugadorActivo(getJugadorActivo()+1);   
            }
        if(getInicioTerritorios()==false) 
        getMJugador().get(getJugadorActivo()).Rearmamiento(mTablero);
        setChanged();
        notifyObservers();
    }
    
    public void setInicioTerritorios(boolean b){
        inicioTerritorios=b;
    }
    public boolean getInicioTerritorios(){
        return inicioTerritorios;
    }
    
    
    public void anadirObservers(){
        this.addObserver(Jframe);
        for (int i=0;i<getMJugador().size();i++)
            getMJugador().get(i).addObserver(Jframe);
    }
    
    

}

