package parqueo;
import java.util.ArrayList;
import java.time.LocalDate;

public class GestorParqueo {

    private static final int MAX_VEHICULOS = 10;

    private ArrayList<Vehiculo> vehiculosParqueados;
    private ArrayList<TiqueteParqueo> tiquetes;

    public GestorParqueo() {

        this.vehiculosParqueados = new ArrayList<Vehiculo>();
        this.tiquetes = new ArrayList<TiqueteParqueo>();

    }

    public boolean registrarIngreso(TiqueteParqueo nuevoTiquete) {
        if (this.vehiculosParqueados.size() < MAX_VEHICULOS
                && !existePlaca(nuevoTiquete.getVehiculo().getPlaca())) {
            this.vehiculosParqueados.add(nuevoTiquete.getVehiculo());
            this.tiquetes.add(nuevoTiquete);
            return true;
        }
        if (this.vehiculosParqueados.size() > 4){
            System.out.println("Aviso: quedan " + espaciosDisponibles() + "espacios disponibles.");
        }
        return false;
    }

    public boolean existePlaca(String placa) {
        for (Vehiculo vehiculo : this.vehiculosParqueados) {
            if (vehiculo.getPlaca().equals(placa)) {
                return true;
            }
        }
        return false;
    }

    public int espaciosDisponibles() {
        return MAX_VEHICULOS - this.vehiculosParqueados.size();
    }

    public int getCapacidadMaxima() {
        return MAX_VEHICULOS;
    }

    public boolean estaVacio() {
        return this.vehiculosParqueados.isEmpty();
    }

    public TiqueteParqueo buscarTiqueteAbierto(String placa) {
        for (TiqueteParqueo tiquete : this.tiquetes) {
            if (tiquete.getVehiculo().getPlaca().equals(placa) && tiquete.getHoraSalida() == null) {
                return tiquete;
            }
        }
        return null;
    }

    public boolean registrarSalida(String placa) {
        boolean vehiculoEliminado = false;
        for (int i = 0; i < this.vehiculosParqueados.size(); i++) {
            if (this.vehiculosParqueados.get(i).getPlaca().equals(placa)) {
                this.vehiculosParqueados.remove(i);
                vehiculoEliminado = true;
                break;
            }
        }

        return vehiculoEliminado;
    }

    public Vehiculo buscarPlaca(String placa) {
        for (Vehiculo vehiculo : this.vehiculosParqueados) {
            if (vehiculo.getPlaca().equals(placa)) {
                return vehiculo;
            }
        }
        return null;
    }

    public ArrayList<TiqueteParqueo> getTiquetesDia(LocalDate fecha) {
        ArrayList<TiqueteParqueo> resultado = new ArrayList<TiqueteParqueo>();
        for (TiqueteParqueo tiquete : this.tiquetes) {
            if (tiquete.getHoraEntrada() != null
                    && tiquete.getHoraEntrada().toLocalDate().equals(fecha)) {
                resultado.add(tiquete);
            }
        }
        return resultado;
    }

}
