package pckPlano;

/** Ultima atualizacao : 03-05-2001 
 * Autores : Claudio Copello - 980860
 *           Joao Porto - 981389
 *           Joao Guilherme - 981374
 *           Joyce Ynoue - 981414
 *           Eduardo Lins - 952302
 *           Fernando Viegas - 900508
 */

import pckDemanda.Encomenda;
import pckMapa.Trecho;
import pckMapa.Conexao;

public class ValidadorImpl extends Validador {

    private Boolean conectTrecho( Rota[] planoRotas ){
	/** Validacao da conectividade dos trechos
	 *  dst(trecho(Pi))=org(trecho(pi+1)) 
	 * Entrada: Plano de Rotas
	 * Saida: Verdadeiro se os trechos sao conexos. Falso, caso contrario
	 */
	int i,j;
	Passo[] p;
	for (i=0; i<planoRotas.length(); i++){
	    p = planoRotas[i].passos();
	    for (j=0; j<p.length()-1; j++)
		if(!pode(p[i].trecho(),p[i+1].trecho()))
		    return false;
	} 
	return true;
    }


    public Boolean tempoPercTrechos( Rota[] planoRotas){
	/** Validacao do tempo de permanencia em um trecho
	 * Entrada: Plano de Atendimento, Encomendas e Veiculos
	 * Saida: Verdadeiro se o tempo de permanencia eh valido. Falso, caso contrario
	 */
	Passo[] passos;
	Encomenda[] carregadas, descarregadas;
	float tempoTotalCarga, tempoTotalDescarga;

	/* para cada rota do plano de rotas */
	for (int r=0; r<planoRotas.length; r++){

	    /* para cada passo desta rota */
	    passos = planoRotas[r].passos;
	    for (int p=0; p<passos.length; p++){

		/* calculando o tempo total de cargas neste passo */
		tempoTotalCarga = 0;
		carregadas = passos[p].carrega;
		for (int e=0; e<carregadas.length; e++){
		    tempoTotalCarga = tempoTotalCarga + carregadas[e].getTempoCarga;
		}

		/* calculando o tempo total de descargas neste passo */
		tempoTotalDescarga = 0;
		descarregadas = passos[p].descarrega;
		for (int e=0; e<descarregadas.length; e++){
		    tempoTotalDescarga = tempoTotalDescarga + descarregadas[e].getTempoDescarga;
		}

		/**********************************
		 *ALTERAR:
		 *passos[p].trecho.tempoPercurso para o nome correto que tiver sido definido
		 *conversao de tempoTotalCarga e tempoTotalDescarga para a unidade apropriada
		 **********************************/
		
		if ( passos[p].intervalo.inicio +
		     tempoTotalCarga +
		     tempoTotalDescarga +
		     passos[p].trecho.tempoPercurso >
		     passos[p].intervalo.fim ){
		    errorMessage = errorMessage + "nTempo de permanencia em um trecho excedido.";
		    return false;
		}

	    }

	    return true;

	}


	public Boolean capacidade( Plano planoAtendimento ){
	    /** Validacao da capacidade do veiculo
	     * Entrada: Plano de Atendimento
	     * Saida: Verdadeiro se a capacidade e sempre valida. Falso, caso contrario
	     */
	    
	    Rota[] rotas;
	    Passo[] passos;
	    Encomenda[] encomendas;
	    int capv, carga;

	    rotas = planoAtendimento.rotas;

	    // Loop para percorrer todas as rotas do Plano
	    for( int r=0; r < rotas.length; r++ ){

		// Obtem a capacidade do veiculo designado para esta rota
		capv = rotas[r].veiculo.getCapacidade;
		// Zera a carga inicial
		carga = 0;

		passos = rotas[r].passos; 
		// Percorre todos os passos da rota verificando a capacidade do veiculo
		for( int p=0; p < passos.length; p++ ){

		    // Acumula todas as encomendas carregadas ate o passo p que
		    // nao foram descarregadas ainda

		    // Adiciona 'a carga as encomendas carregadas neste passo
		    encomendas = passos[p].carrega; 
		    for( int e=0; e < encomendas.length; e++) {
			carga += encomendas[e].volume;
		    }

		    // Subtrai da carga as encomendas descarregadas neste passo
		    encomendas = passos[p].descarrega; 
		    for( int e=0; e < encomendas.length; e++) {
			carga -= encomendas[e].volume;
		    }

		    // Verifica se a carga ao final do passo excede a capacidade do veiculo
		    if (carga > capv){
			errorMessage = errorMessage + "\n Capacidade Maxima do Veiculo excedida";
			return false;
		    }
		}
	    }
	    return true;
	}
    
    }
}











