package UhuRisk;

import java.util.ArrayList; 
import java.io.*;
import java.awt.Color;
import java.util.Observable;
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.*;
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
import java.util.Random;
// #[regen=yes,id=DCE.87B45317-FB11-DA8E-4BF8-8F3975FE4E4D]
import javax.persistence.CascadeType;
import javax.persistence.OneToMany;
// </editor-fold> 
@Entity
public class Jugador extends Observable implements Serializable{

    private static final long serialVersionUID = 1L;
    
       
    public void setId(Long id) {
        this.id = id;
    }

    
    public Long getId() {
        return id;
    }
    
   
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="JugadorID")
    private long id;
    
    @Column(name="Jugador")
    private String nombre;
    
    
    @Override
    public String toString() {
        return "Jugador "+id+":"+nombre;
    }
    
    
    @Transient
    private int idJugador;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.12C9C19C-30E7-B7D8-6797-CF1088C69EE7]
    // </editor-fold> 
    @Transient
    private Partida mPartida;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.B2B6D814-958D-A046-83BA-70C14FE423D2]
    // </editor-fold> 
    private int numEjercitos;
    
    @Transient
    private int numCanjes;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.53B8BA4C-D201-04E0-830D-2A761F8FA65C]
    // </editor-fold> 
   
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.FD3420E0-E390-9ADE-4FFF-094DED8D6603]
    // </editor-fold> 
    @Transient
    private Carta_Mision mCarta_Mision;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.21FDBD7B-7A2D-DA68-3028-9171D334EEA1]
    // </editor-fold> 
    @Transient
    private ArrayList<Carta_Territorio> mCarta_Territorio;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.573DB772-DF00-6CC6-8135-A57751394B3D]
    // </editor-fold> 
    @Transient
    private ArrayList<Territorio> mTerritorio;
    
    @Transient
    private ArrayList<Continente> mContinente;
    
    @Transient
    private int numContinente;
    
    @Transient
    private int numCartas;
    
    @Transient
    private int numTerritorios;
    
    @Transient
    private int numConquistas;
    
    @Transient
    private Color color;
    
    @Transient
    private boolean primerTurno=true; // true si esta en el primer turno o false si no lo esta
    
    @Transient
    private fatacar fa;
    
    @Transient
    private fTablero ft;
    
    @Transient
    private boolean jugando;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.193F1C92-226A-D1F6-BBBF-F13D2273A37A]
    // </editor-fold> 
    public Jugador () {
    }

    public Jugador(int numEjer, String nom, int id, Color col){
        numEjercitos=numEjer;
        nombre=nom;
        idJugador=id;
        numCanjes=0;
        color=col;
        mTerritorio=new ArrayList();
        jugando=true;
        numConquistas=0;
        numCartas=0;
        mCarta_Territorio=new ArrayList();
        numContinente=0;
    }
    
    public Jugador(Jugador j){
        this.nombre=j.getNombre();
        this.numEjercitos=j.getNumEjercitos();
    }
    
    public void aumentarEjercitos(int val){
        numEjercitos=numEjercitos+val;
    }
    
    public void disminuirEjercitos(int val){
        numEjercitos=numEjercitos-val;
    }
    
    public int getnumContinentes(){
        return numContinente;
    }
    public void setnumContinentes(){
        numContinente++;
    }
    
    public int getnumCartas(){
        return numCartas;
    }
    public void setnumCartas(){
        numCartas++;
    }
    public int getnumTerritorios(){
        return numTerritorios;
    }
    public void setnumTerritorios(){
        numTerritorios++;
        setChanged();
        notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.371650CA-5B67-148F-5892-7665205F178B]
    // </editor-fold> 
    public int getNumEjercitos () {
        return numEjercitos;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.0EB2599D-EFB1-AD57-77AD-55A0DA8D05FB]
    // </editor-fold> 
    public void setNumEjercitos (int val) {
        numEjercitos=val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.F666CDD4-7BAF-0FD9-752F-B2F1F588CE4F]
    // </editor-fold> 
    public Carta_Mision getCarta_Mision () {
        return mCarta_Mision;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.BF63CDA9-1445-203C-3325-7A21680AEB86]
    // </editor-fold> 
    public ArrayList<Carta_Territorio> getCarta_Territorio () {
        return mCarta_Territorio;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.DC535877-5BA8-7D94-2C21-C1B05C317743]
    // </editor-fold> 
    public void setCarta_Territorio (ArrayList<Carta_Territorio> val) {
        this.mCarta_Territorio = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.2B9172DD-5F6F-9D83-EE12-A9464CB132D4]
    // </editor-fold> 
    public ArrayList<Territorio> getTerritorio () {
        return getMTerritorio();
    }
    public Territorio getTerritorio(int idt){
       boolean dev=false;
       int i;
       Territorio t=null;
       for(i=0;i<mPartida.getNumTerritorios() && dev==false;i++){
          Territorio t1=mPartida.getTerritorio().get(i);
          if(t1.getIdTerritorio()==idt){
             dev=true;
             t=t1;
          }
       }
       return t;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.8DC34B73-6816-99E8-22B1-8E5C4B923F75]
    // </editor-fold> 
    public void setTerritorio (ArrayList<Territorio> val) {
        this.setMTerritorio(val);
        numTerritorios=getMTerritorio().size();
    }
    
     public Continente getContinente(int idc){
       boolean dev=false;
       int i;
       Continente c=null;
       for(i=0;i<mPartida.getNumContinentes() && dev==false;i++){
          Continente c1=mPartida.getContinente().get(i);
          if(c1.getIdContinente()==idc){
             dev=true;
             c=c1;
          }
       }
       return c;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.8DC34B73-6816-99E8-22B1-8E5C4B923F75]
    // </editor-fold> 
    public void setContinente (ArrayList<Continente> val) {
        this.mContinente = val;
        numContinente=mContinente.size();
    }
    
    public void anadirContinente(Continente val){
        this.mContinente.add(val);
        numContinente=mContinente.size();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.69895A14-2CA4-1F20-B4F0-9693D370E3AA]
    // </editor-fold> 
    public String getNombre () {
        return nombre;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.2D49BB75-1404-8B3A-574A-4B635E4D6DC8]
    // </editor-fold> 
    public void setNombre (String val) {
        this.nombre = val;
    }
 
    
    public void setCarta_Mision (Carta_Mision val) {
        this.mCarta_Mision = val;
    }
    
    public int NumTerrAleatorio(){
        Random rnd=new Random();
        int n;
        n=rnd.nextInt(45);
        return n;
    }
    

    
    public void finalizarTurno () {
        
        if(mPartida.getJugador(mPartida.getJugadorActivo()).getNumConquistas()!=0 && this.getnumCartas()<6){
           //creo una carta
           int numTerr= mPartida.getJugador(mPartida.getJugadorActivo()).NumTerrAleatorio();
           Carta_Territorio c=mPartida.getCarta(numTerr);
           this.mCarta_Territorio.add(c);
           this.setnumCartas();
           mPartida.getJugador(mPartida.getJugadorActivo()).setNumConquistas(0);
        }
        mPartida.cambiarJugadorActivo();
        while(mPartida.getJugador(mPartida.getJugadorActivo()).isJugando()==false){
           mPartida.cambiarJugadorActivo();
        }
        if(mPartida.isPrimerTurno()==false){
            mPartida.getJugador(mPartida.getJugadorActivo()).recalcularEjercitos();
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.6F9C923B-E71D-8228-9723-556C2C71EEAB]
    // </editor-fold> 
    public Partida getPartida () {
        return mPartida;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.3ED7DED1-7807-50C3-45D7-23ACEA6DA72E]
    // </editor-fold> 
    public void setPartida (Partida val) {
        this.mPartida = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.C6ECC7B0-F6F4-6D44-AD10-FE3614E8F0F0]
    // </editor-fold> 
    
    public boolean algunoDesocupado(){
        int i;
        boolean dev=false;
        for(i=0; i<numTerritorios && dev==false; i++){
            if(getMTerritorio().get(i).getNumEjercitos()==0)
                dev=true;
        }
        return dev;
    }
    
    public String ubicarEjercitos(Territorio t){
        String mensaje;
        //int idactivo=mPartida.getJugadorActivo();
        if(this.poseoTerritorio(t.getIdTerritorio())==false){
            mensaje="Ese territorio no le pertenece. Pulse otro territorio.";
        }
        else{
            if(t.getNumEjercitos()>0 && this.algunoDesocupado()==true){
                mensaje="Tiene territorios sin ocupar. Pulse otro territorio.";
            }
            else{
                if(this.getNumEjercitos()==0){
                    mensaje="No tiene ejercitos para ubicar. Pulse continuar.";
                }
                else{
                    t.aumentarNumEjercitos(1);
                    this.disminuirEjercitos(1);
                    if(this.getNumEjercitos()==0){
                        mensaje="Se ha ubicado un ejercito en el territorio "+t.getNomTerritorio()+". Pulse continuar.";
                    }
                    else{
                        mensaje="Se ha ubicado un ejercito en el territorio "+t.getNomTerritorio()+". Continue ubicando.";
                    }
                }
            }
        }
        return mensaje;
    }
    
    
    public boolean poseoTerritorio(int idt){
       boolean dev=false;
       int i;
       for(i=0;i<this.numTerritorios && dev==false;i++){
          if(getMTerritorio().get(i).getIdTerritorio()==idt){
             dev=true;
          }
       }
       return dev;
    }
    
    
    public void recalcularEjercitos(){
        int enc=0;
        int numejedisp=this.getnumTerritorios()/3;
        if(numejedisp<3){
            numejedisp=3;
        }
        int num=this.mPartida.getNumContinentes();
        int i,j;
        for(i=0; i<num; i++){
            boolean dev=this.poseoTodosTer(i+1);
            if(dev==true){
                numejedisp=numejedisp+this.mPartida.getContinente().get(i).getBonificacion();
            }
        } 
        this.setNumEjercitos(numejedisp);
    }
    
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.C89952CF-AC89-A5F5-45F9-CC4F1275EEA5]
    // </editor-fold> 
    public boolean comprobarAtaque (Territorio at, Territorio def) {
        boolean dev;
        if(this.poseoTerritorio(at.getIdTerritorio())==false){
            dev=false;
        }
        else if(this.poseoTerritorio(def.getIdTerritorio())==true){
            dev=false;
        }
        else if(at.getNumEjercitos()<=1){
            dev=false;
        }
        else if(at.adyacente(def.getIdTerritorio())==false){
            dev=false;
        }
        else{
            dev=true;
        }
        return dev;
    }
    
    public boolean comprobarTransferencia (Territorio origen, Territorio destino) {
        boolean dev;
        if(this.poseoTerritorio(origen.getIdTerritorio())==false){
            dev=false;
        }
        else if(this.poseoTerritorio(destino.getIdTerritorio())==false){
            dev=false;
        }
        else if(origen.getNumEjercitos()<=1){
            dev=false;
        }
        else if(origen.adyacente(destino.getIdTerritorio())==false){
            dev=false;
        }
        else{
            dev=true;
        }
        return dev;
    }
    
    
    public void invadirTerritorio(Territorio origen, Territorio destino, int numEjercitos){
        origen.disminuirNumEjercitos(numEjercitos);
        destino.aumentarNumEjercitos(numEjercitos);
    }
    
    public boolean poseoTodosTer(int idCont){
        Continente t=this.getPartida().getContinente().get(idCont-1);
        int num=t.getTerritorio().size();
        int i;
        boolean dev=true;
        for(i=0; i<num && dev==true;i++){
            if(this.getTerritorio().contains(t.getTerritorio().get(i))==false){
                dev=false;
            }
        }
        return dev;
    } 
    
    public String atacarTerritorio (Territorio at, Territorio def, Dado dataque, Dado ddefensa) {
        String dev;
        int[] lat;
        int[] lde;
        if(at.getNumEjercitos()>=3){
            dataque.hacerTirada(3);
            lat=dataque.getTirada();
            if(def.getNumEjercitos()>=2){
                ddefensa.hacerTirada(2);
                lde=ddefensa.getTirada();
            }
            else{
                ddefensa.hacerTirada(1);
                lde=ddefensa.getTirada();
            }       
        }
        else{
            if(def.getNumEjercitos()>=2){
                dataque.hacerTirada(1);
                lat=dataque.getTirada();
                ddefensa.hacerTirada(2);
                lde=ddefensa.getTirada();
            }
            else{
                dataque.hacerTirada(2);
                lat=dataque.getTirada();
                ddefensa.hacerTirada(1);
                lde=ddefensa.getTirada();
            }
        }
        int[] disminuye=dataque.comparar(lat, lde);
        
        
        at.disminuirNumEjercitos(disminuye[0]);
        def.disminuirNumEjercitos(disminuye[1]);
        dev=at.getNomTerritorio()+" pierde "+disminuye[0]+" ejercitos. "+def.getNomTerritorio()+" pierde "+disminuye[1]+" ejercitos.";
        if(def.getNumEjercitos()==0){
            Jugador jdef=this.getPartida().getJugador(def.getIdJugador());
            jdef.getTerritorio().remove(def);
            jdef.disminuirNumTerritorios(1);
            this.getTerritorio().add(def);
            this.aumentarNumTerritorios(1);
            def.setColor(this.getColor());
            def.setIdJugador(this.getIdJugador());
            this.setNumConquistas(this.getNumConquistas() + 1);
        }
        return dev;
    }
        
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.90E9EFA7-0AED-7580-1988-EABEA30248F7]
    // </editor-fold> 

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.840B6385-AEFF-085B-0FBE-ECA7239C3B06]
    // </editor-fold> 


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.03876686-AE2E-BDC9-7157-0E60350C0C9A]
    // </editor-fold> 
    public String transferirEjercitos (Territorio origen, Territorio destino, int num) {
        this.getTerritorio(origen.getIdTerritorio()).disminuirNumEjercitos(num);
        this.getTerritorio(destino.getIdTerritorio()).aumentarNumEjercitos(num);
        String dev="Se han transferido "+num+" ejercitos desde "+origen.getNomTerritorio()+" hacia "+destino.getNomTerritorio()+".";
        return dev;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.BA2BFEBC-A035-D85B-B2C0-C516660C4DC5]
    // </editor-fold> 
    public void verCartas () {
       int i;
       for(i=0;i<this.numCartas;i++)
          System.out.println(this.mCarta_Territorio.get(i).getNomCarta());
       setChanged();
       notifyObservers();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.C3D121FB-E2C5-8A08-8CA3-04CF014727CC]
    // </editor-fold> 
    public void cambiarCartas () {
    }

    public int getIdJugador(){
        return idJugador;
    }
    
    public void setIdjugador(int val){
        idJugador=val;
    }

    public boolean isPrimerTurno() {
        return primerTurno;
    }

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

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public fatacar getFa() {
        return fa;
    }

    public void setFa(fatacar fa) {
        this.fa = fa;
    }

    public fTablero getFt() {
        return ft;
    }

    public void setFt(fTablero ft) {
        this.ft = ft;
    }

    public void aumentarNumTerritorios(int num){
        this.numTerritorios=this.numTerritorios+num;
    }
    
    public void disminuirNumTerritorios(int num){
        this.numTerritorios=this.numTerritorios-num;
    }

    public int getNumConquistas() {
        return numConquistas;
    }

    public void setNumConquistas(int numConquistas) {
        this.numConquistas = numConquistas;
    }

    public ArrayList<Territorio> getMTerritorio() {
        return mTerritorio;
    }

    public void setMTerritorio(ArrayList<Territorio> mTerritorio) {
        this.mTerritorio = mTerritorio;
    }

    public boolean isJugando() {
        return jugando;
    }

    public void setJugando(boolean jugando) {
        this.jugando = jugando;
    }

    public void persist(Object object) {
        EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("Java-UhuRiskPU");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try {
            em.persist(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }
    
    
}

