package pmicrovenus;
import java.util.ArrayList;
import java.util.Observable;
        
public class Jugador extends Observable{

    private int idJugador;
    private String nombre;
    private int saldo;
    private int encarcelado;
    private Casilla Posicion;
    private ArrayList<Solar> solar;
    private ArrayList<Servicio> servicio;
    private ArrayList<Estacion> estacion;
   

    public Jugador() {
         
    }
    public Jugador(int i,String nombre, int saldo) {
        this.idJugador=i;
        this.nombre=nombre;
        this.saldo=saldo;
        encarcelado=0;
        solar = new ArrayList<Solar>();
        servicio = new ArrayList<Servicio>();
        estacion = new ArrayList<Estacion>();
        
    }
    
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String val) {
        this.nombre = val;
        setChanged();
        notifyObservers();
    }
    public int getSaldo() {
        return saldo;
    }
    public void setSaldo(int val) {
        this.saldo = val;
        setChanged();
        notifyObservers();
    }
    public int getEncarcelado() {
        return encarcelado;
    }
    public void setEncarcelado(int val) {
        this.encarcelado = val;
        setChanged();
        notifyObservers();
    }
    
    public boolean isEnBancarrota() {
        return saldo < 0;
    }
  
    public void ingreso(int val) {
        this.saldo =this.saldo + val;
        setChanged();
        notifyObservers();
    }
    public void reintegro(int val) {
        this.saldo =this.saldo - val;
        setChanged();
        notifyObservers();
    }
    public int getIdJugador() {
        return idJugador;
    }
    public void setIdJugador(int idJugador) {
        this.idJugador = idJugador;
        setChanged();
        notifyObservers();
    }
    public Casilla getPosicion() {
        return Posicion;
    }
    public void setPosicion(Casilla pos) {
        this.Posicion = pos;
        setChanged();
        notifyObservers();
    }
    
     public int getNumSolares() {
        return solar.size();
    }
   
     public int getNumEstaciones() {
        return estacion.size();
    }
      
      public int getNumServicios() {
        return servicio.size();
    }
      
      public boolean tieneSolar(String propiedad) {
        for(int i=0;i<solar.size();i++) {
            Casilla c = (Casilla)solar.get(i);
            if(c.getDescripcion().equals(propiedad)) {
                    return true;
                }
        }
        return false;	
	}
      
      public boolean tieneEstacion(String propiedad) {
        for(int i=0;i<estacion.size();i++) {
            Casilla c = (Casilla)estacion.get(i);
            if(c.getDescripcion().equals(propiedad)) {
                    return true;
                }
        }
        return false;	
	}
     
      public boolean tieneServicio(String propiedad) {
        for(int i=0;i<servicio.size();i++) {
            Casilla c = (Casilla)servicio.get(i);
            if(c.getDescripcion().equals(propiedad)) {
                    return true;
                }
        }
        return false;	
	}
      
    public void pagarRenta(){
        int renta=Posicion.getRenta();
        Jugador j = Posicion.getPropietario();
        
        if(saldo < renta) {
		j.ingreso(saldo);//propietario.saldo += saldo;
		reintegro(renta);
	}
	else {
		reintegro(renta);
                j.ingreso(renta);
	}
//	if(isEnBancarrota()) {
////		saldo = -1;
//		cambiarPropietario(j);
//	}
        
        System.out.println("Has pagado "+Posicion.getRenta()+"€ al jugador "+ (Posicion.getPropietario().getIdJugador()+1));                      
    }
    
    public void pagarRentaA(Jugador j,int renta){
        if(saldo < renta) {
		j.ingreso(saldo);
		reintegro(renta);
	}
	else {
                j.ingreso(renta);
		reintegro(renta);
	}
//      if(isEnBancarrota()) {
////		saldo = -1;
//		cambiarPropietario(j);
//	}
        
        
        System.out.println("Has pagado "+ renta +"€ al jugador "+ (j.getIdJugador()+1));                       
    }
     
    public void comprarPropiedad(Casilla propiedad, int precio){
        
        propiedad.setPropietario(this);
        if (Posicion instanceof Solar){
            solar.add((Solar) Posicion); 
        }
        if (Posicion instanceof Servicio){
            servicio.add((Servicio) Posicion);
        }
        if (Posicion instanceof Estacion){
            estacion.add((Estacion) Posicion);
        }
        reintegro(precio);
        System.out.println("Has comprado " + propiedad.getDescripcion());
        //System.out.println("Su nuevo saldo es " + saldo);
    }
    
    public void comprar() {
        Casilla c = getPosicion();
        if(c.isDisponible()) {
            if(c.getPrecioCompra() <= saldo) {
                c.setDisponible(false);
                if(c instanceof Solar) {
                    comprarSolar((Solar)c);
                }
                if(c instanceof Estacion) {
                    comprarEstacion((Estacion)c);
                }
                if(c instanceof Servicio) {
                    comprarServicio((Servicio)c);
                }
            }
        }
    }
     
    private void comprarSolar(Solar propiedad) {
        comprarPropiedad(propiedad, propiedad.getPrecioCompra());
    }
    private void comprarEstacion(Estacion propiedad) {
        comprarPropiedad(propiedad, propiedad.getPrecioCompra());
    }
    private void comprarServicio(Servicio propiedad) {
        comprarPropiedad(propiedad, propiedad.getPrecioCompra());
    }
  
    public void venderPropiedad(Casilla propiedad, int dinero) {
        propiedad.setPropietario(null);
        if(propiedad instanceof Solar) {
            solar.remove(propiedad);
        }
        if(propiedad instanceof Estacion) {
            estacion.remove(propiedad);
        }
        if(propiedad instanceof Servicio) {
            servicio.remove(propiedad);
        }
        ingreso(dinero);
    }
    
}
