import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public abstract class Jugador {
    public static final int HUMANO = 1;
    public static final int ROBOT = 2;
    public static final String HUMANO_STRING = "Humano";
    public static final String ROBOT_STRING = "Robot";
    protected final String nombre;
    protected final int tipo;
    protected final Mesa mesa;
    protected final List<Ficha> fichas;
    // Era un set pero no encontre una manera eficiente
    // de obtener un elemento al azar.
    public Jugador(int tipo, String nombre, Mesa mesa) {
        this.nombre = nombre;
        this.mesa = mesa;
        this.tipo = tipo;
        fichas = new LinkedList();
    }
    public final boolean isHuman() {
        return (tipo == HUMANO);
    }
    private String tipoToString() {
        if (tipo == HUMANO) {
            return HUMANO_STRING;
        } else {
            return ROBOT_STRING;
        }
    }
    public abstract Tirada preguntarTiradaAJugador(ArrayList<Tirada> tiradas);
    public final Ficha getDobleMasAlto() {
        Ficha dobleMasAlto = null;
        for (Ficha f : fichas) {
            if (f.esUnDoble() && ((dobleMasAlto == null)
                    || (f.peso() > dobleMasAlto.peso()))) {
                dobleMasAlto = f;
            }
        }
        return dobleMasAlto;
    }
    public final int getNumFichas() {
        return fichas.size();
    }
    public final Ficha getFichaAlAzar() {
        // List en lugar de set para poder hacer get()
        return fichas.get(Azar.numeroAlAzar(fichas.size()));
    }
    public final boolean tiraFicha(Ficha ficha) {
        return fichas.remove(ficha);
    }
    public final void pillaFicha(Ficha ficha) {
        fichas.add(ficha);
    }
    public final ArrayList<Tirada> posiblesTiradas() {
        ArrayList tiradas = new ArrayList<>();
        int izq = mesa.getExtremoIzquierdo();
        int der = mesa.getExtremoDerecho();
        for (Ficha f : fichas) {
            if ((f.getA() == izq) || (f.getB() == izq)) {
                tiradas.add(new Tirada(f, ExtremoMesa.IZQUIERDO));
            }
            if ((f.getA() == der) || (f.getB() == der)) {
                tiradas.add(new Tirada(f, ExtremoMesa.DERECHO));
            }
        }
        return tiradas;
    }
    public final String nombreToString() {
        return nombre + "(" + tipoToString() + ")";
    }
    @Override
    public final String toString() {
        String s = "";
        for (Ficha f : fichas) {
            s += f;
        }
        s += nombreToString();
        return s;
    }
}
