package UhuRisk;


import java.util.ArrayList; 
import java.io.*;
import java.util.*; 
import java.awt.Color;
import java.util.Observable;
import javax.persistence.Entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;
import javax.persistence.*;
        
@Entity
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.50C1F1ED-C701-E2A6-D9E2-A96E3514CC71]
// </editor-fold> 
public class Partida extends Observable implements Serializable{
    private static final long serialVersionUID = 1L;
    
    public void setId(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
    
    @Column(name="Partida")
    private String nomPartida;

    @Override
    public String toString() {
        String mensaje="";//=lJugadores.get(0).getNombre();
        int i;
        for (i=0;i<this.lJugadores.size();i++){
            mensaje=mensaje+lJugadores.get(i).getNombre()+", "; 
        }
        return "Partida: "+nomPartida+" Jugadores: "+mensaje;
    }
    
    @Transient
    private Juego mJuego;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.4D0FCF83-0AFF-9FBD-B491-3F4BEB0E7151]
    // </editor-fold> 
    @Transient
    private int jugadorActivo;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.CCB861E1-E32D-6C6C-589C-1A824FBEEC8C]
    // </editor-fold> 
    @Transient
    private int numJugadores;
    
    @Transient
    private int numTerritorios;

    @Transient
    private int numContinentes;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.78F4148D-7CCE-10C6-84F4-F970F70C263F]
    // </editor-fold> 
    @Transient
    private Tablero mTablero;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.100C97CB-7D8B-03CB-4ED8-48F0C0124DF3]
    // </editor-fold> 
    @OneToMany
    private List<Jugador> lJugadores;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="JuegoID")
    private long id;

    @Transient
    private ArrayList<Territorio> lTerritorios;
    
    @Transient
    private ArrayList<Continente> lContinentes;
    
    @Transient
    private ArrayList<Carta_Territorio> lCartas;
    
    @Transient
    private fPartida formPartida;
    
    @Transient
    private boolean ubicando;
    
    @Transient
    private boolean atacando;
    
    @Transient
    private boolean transfiriendo;
    
    @Transient
    private boolean primerTurno;
    
    @Transient
    private int numRondas;
    
    @Transient
    private int numRondaActual;
    
    @Transient
    private boolean limiteRondas;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B51BC81C-3708-0BD2-0498-5B9FEE71FEAC]
    // </editor-fold> 
    public Partida () {
    }

    public Partida(String nPartida, int NumJug, Juego val){
        nomPartida=nPartida;
        numJugadores=NumJug;
        mJuego=val;
        lJugadores=new ArrayList(numJugadores);
        lTerritorios=new ArrayList();
        lContinentes=new ArrayList();
        lCartas=new ArrayList();
        primerTurno=true;
        numRondaActual=1;
        limiteRondas=false;
    }
    
    public Partida(String nPartida, int NumJug, Juego val, int nrondas){
        nomPartida=nPartida;
        numJugadores=NumJug;
        mJuego=val;
        lJugadores=new ArrayList(numJugadores);
        lTerritorios=new ArrayList();
        lContinentes=new ArrayList();
        lCartas=new ArrayList();
        primerTurno=true;
        numRondaActual=1;
        numRondas=nrondas;
        limiteRondas=true;    
    }
    
    public boolean terminarJuego(){
        boolean dev=false;
        if(this.lJugadores.get(this.getJugadorActivo()-1).getnumTerritorios()==this.getNumTerritorios()){
            dev=true;
        }
        return dev;
    }
    
    public void anadirTerritorio(Territorio t){
        lTerritorios.add(t);
    }
    
    public void anadirContinente(Continente c){
        lContinentes.add(c);
    }
    
    public void anadirCarta(Carta_Territorio c){
        lCartas.add(c);
    }
    public void setNumTerritorios(int val){
        this.numTerritorios=val;
    }
    
    public void setNumContinentes(int val){
        this.numContinentes=val;
    }
    
     public int getNumContinentes(){
        return this.numContinentes;
    }

    public int getNumTerritorios(){
        return this.numTerritorios;
    }
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.7B9878B8-AE71-4796-8BD1-0D98DADB384E]
    // </editor-fold> 
    public String getNomPartida () {
        return this.nomPartida;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.DBF47A24-82B2-EEA3-91D2-BB4A6C08C4E9]
    // </editor-fold> 
    public void setNomPartida (String val) {
        this.nomPartida=val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.4FC03AD1-889B-3E30-BA07-E45B1C586BD4]
    // </editor-fold> 
    public int getNumJugadores () {
        return numJugadores;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.263A6A77-76E1-9FFB-C3B6-E687D459C071]
    // </editor-fold> 
    public void setNumJugadores (int val) {
        this.numJugadores=val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.DC66BDEF-DDE9-E684-FCE5-3714C8EC411B]
    // </editor-fold> 
    public void crearJugador () {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.AB63706E-A75D-CE2B-495B-05290583C90C]
    // </editor-fold> 
    public Dado getDado () {
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.AA3BEA16-C31D-6D12-7EB8-7AD85B52768A]
    // </editor-fold> 
    public void setDado (Dado val) {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.FB7F9E19-7140-00A1-9E5B-2BFFBA2B43EE]
    // </editor-fold> 
    public List<Jugador> getJugadores () {
        return lJugadores;
    }

    public Jugador getJugador(int val){  //Se le pasa el identificador por parametro y devuelve el jugador
        int i=val-1;
        return lJugadores.get(i);     
    }
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.C758D597-9651-E590-95BE-52AB19E762F7]
    // </editor-fold> 
    public Tablero getTablero () {
        return mTablero;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.0095163E-A999-58EF-DA47-C3818E1AC2F7]
    // </editor-fold> 
    public void setTablero (Tablero val) {
        mTablero=val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.ED23BF9A-2A07-B2D3-EC04-A76817B20863]
    // </editor-fold> 
    public int getJugadorActivo () {
        return jugadorActivo;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.D13CF139-B4E2-FE0C-254B-76A1FAE86010]
    // </editor-fold> 
    public void setJugadorActivo (int val) {
        jugadorActivo = val;
    }
    
    public void cambiarJugadorActivo()
    {
        int i =jugadorActivo+1;
        if(i>numJugadores){
            jugadorActivo=1;
            this.numRondaActual++;
        }
        else
        jugadorActivo=i;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.4F032575-19A5-F12B-9DC6-3873377C454C]
    // </editor-fold> 
    public void setJugador (ArrayList<Jugador> val) {
        this.lJugadores = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.49616FC1-A263-A3BE-026C-C0FF9F073F4B]
    // </editor-fold> this.
    public void anadirJugador (Jugador val) {
        this.lJugadores.add(val);
    }
    
    public void asignarPartJug(Partida val){ //asigna un valor al atributo mPartida de cada jugador
        int i;
        for(i=0; i<numJugadores;i++)
            lJugadores.get(i).setPartida(val);
        
        setChanged();
        notifyObservers();
    }
    
    public void asignarPartTer(Partida val){ //asigna un valor al atributo mPartida de cada territorio
        int i=0;
        for(i=0; i<numTerritorios;i++)
            lTerritorios.get(i).setPartida(val);
        
        setChanged();
        notifyObservers();
    }

    public void creaJugador(int numEje, String nombre, int id, Color color){
        Jugador jug=new Jugador(numEje, nombre, id, color);
        this.anadirJugador(jug);
    }
    
    public void ponerActivo(){
        this.setJugadorActivo(1);
    }
    
    public ArrayList<Territorio> getTerritorio(){
        return lTerritorios;
    }
    
    public ArrayList<Continente> getContinente(){
        return lContinentes;
    }
    
    public void asignarTerritorios(){ //asigna los territoris a los jugadores
        int i,j;
        for(i=1;i<=numJugadores;i++){
            ArrayList<Territorio> l=new ArrayList();
            j=i;
            while(j<=numTerritorios){
                    lTerritorios.get(j-1).setIdJugador(i);
                    lTerritorios.get(j-1).setColor(lJugadores.get(i-1).getColor());
                    l.add(lTerritorios.get(j-1));
                    j=j+numJugadores;
            }
            lJugadores.get(i-1).setTerritorio(l);
        }
        int k;
        for(k=0; k<this.numTerritorios; k++){
            this.lTerritorios.get(k).aumentarNumEjercitos(1);
            this.lJugadores.get(this.lTerritorios.get(k).getIdJugador()-1).disminuirEjercitos(1);
        }
    }
    
    public void muestraTerritorios(){
        System.out.println("\nAsi esta el estado de los territorios");
        System.out.println("-------------------------------------");
        int i;
        for (i=0;i<numTerritorios;i++){
            Territorio aux=lTerritorios.get(i);
            String nom=lJugadores.get(aux.getIdJugador()-1).getNombre();
            System.out.println(aux.getIdTerritorio()+". "+aux.getNomTerritorio() +" ("+nom+"), NE:"+aux.getNumEjercitos());
        }
    }

    public boolean isUbicando() {
        return ubicando;
    }

    public void setUbicando(boolean ubicando) {
        this.ubicando = ubicando;
    }

    public Carta_Territorio getCarta(int val){
      
       return lCartas.get(val);

    }
    
    public boolean isPrimerTurno() {
        return primerTurno;
    }

    public void setPrimerTurno(boolean primerTurno) {
        this.primerTurno = primerTurno;
    }

    public boolean isAtacando() {
        return atacando;
    }

    public void setAtacando(boolean atacando) {
        this.atacando = atacando;
    }

    public boolean isTransfiriendo() {
        return transfiriendo;
    }

    public void setTransfiriendo(boolean transfiriendo) {
        this.transfiriendo = transfiriendo;
    }

    public int getNumRondas() {
        return numRondas;
    }

    public void setNumRondas(int numRondas) {
        this.numRondas = numRondas;
    }

    public int getNumRondaActual() {
        return numRondaActual;
    }

    public void setNumRondaActual() {
        this.numRondaActual++;
    }

    public boolean isLimiteRondas() {
        return limiteRondas;
    }

    public void setLimiteRondas(boolean limiteRondas) {
        this.limiteRondas = limiteRondas;
    }
    
    
    
}

