package  pckDesenho;

import java.awt.*;
import pckMapa.*;
import pckPlano.*;

public class ArestaImpl extends Aresta{

    /**
     * Membros responsaveis pelo modulo
     * Alessandro Santos: 980553
     * Emilson Margoto: 981048
     **/
    
    /**
     * ArestaImpl é a implementação da representação geométrica
     * (física) de um trecho.
     **/
    
    /**
     * Atributos
     **/
    
    /**
     * Vertice que indica o inicio do trecho
     **/
    VerticeImpl verticeInicial;
    
    /**
     * Vertice que indica o final do trecho
     **/
    VerticeImpl verticeFinal;
    
    /**
     * Apontador para o objeto trecho equivalente a Aresta
     **/
    Trecho trechoEquivalente; 
    
    
    /**
     *  Cor de uma Aresta.
     *  A cor indica o numero de rotas que passa pela aresta.
     **/ 
    Color cor;
    
    /**
     * Nome da cor da aresta.
     **/
    String nomecor;
    
    /**
     * Indica se a aresta está realçada ou não.
     * Se a aresta estiver realçada, a cor desenhada é corRealce,
     * caso contrário é cor.
     **/
    boolean realce;
    
    /**
     * A cor da aresta realçada.
     **/
    static final Color corRealce;

    /**
     * Metodos
     **/
    
    
    /**
     *  Cria uma aresta vazia
     *  Entrada: Nenhuma
     *  Saida: Nova aresta
     **/
    public ArestaImpl() {
	verticeInicial = null;
	verticeFinal = null;
	cor = null;
	nomecor = new String("apagada");
    }
    
    /** 
     *  Cria uma Aresta baseada em um trecho.
     *  Busca as informacoes de ponto inicial e final no trecho.
     *  Entrada: "TrechoEquivalente" trecho que serah representado 
     *  graficamente atraves da aresta.
     *  Saida: Nova Aresta
     **/
    
    public ArestaImpl(Trecho TrechoEquivalente) {
	Ponto temp;
	this.trechoEquivalente = TrechoEquivalente;
	temp = TrechoEquivalente.getInicio().getPonto();
	verticeInicial.setX((int)temp.getX());
	verticeInicial.setY((int)temp.getY());
	temp = TrechoEquivalente.getFim().getPonto();
	verticeFinal.setX((int)temp.getX());
	verticeFinal.setY((int)temp.getY());
	cor = new Color(000000); // toda aresta eh criada preta
	nomecor = new String("preto");
    }
    
    /**
     * Cria uma Aresta baseada nos pontos de vertice inicial e final
     * Entrada:Vertices inicial e final da aresta.
     * Saida: Nova Aresta
     
     **/
    
    public ArestaImpl(VerticeImpl vinicial, VerticeImpl vfinal) {
	verticeInicial = vinicial;
	verticeFinal = vfinal;
	cor = new Color(000000);
	nomecor = new String("preto");
    }
    
    /**
     * Altera a cor da Aresta para "cor" passada como parametro.
     * Entrada: nova cor da aresta
     * Saida: Nenhuma
     **/
    public void setCor(String cor) {
	if (cor.equals("preto")) {
	    this.cor = new Color(000000); nomecor = "preto";
	} else if (cor.equals("azul claro")) {
	    this.cor = new Color(7832572); nomecor = "azul claro";
	} else if (cor.equals("azul")) {
	    this.cor = new Color(255); nomecor = "azul";
	} else if (cor.equals("azul escuro")) {
	    this.cor = new Color(197539); nomecor = "azul escuro";
	} else if (cor.equals("verde claro")) {
	    this.cor = new Color(64612); nomecor = "verde claro";
	} else if (cor.equals("verde")) {
	    this.cor = new Color(65280); nomecor = "verde";
	} else if (cor.equals("verde escuro")) {
	    this.cor = new Color(39168); nomecor = "verde escuro";
	} else if (cor.equals("amarelo claro")) {
	    this.cor = new Color(16383828); nomecor = "amarelo claro";
	} else if (cor.equals("amarelo")) {
	    this.cor = new Color(16776960); nomecor = "amarelo";
	} else if (cor.equals("amarelo escuro")) {
	    this.cor = new Color(14404612); nomecor = "amarelo escuro";
	} else if (cor.equals("laranja claro")) {
	    this.cor = new Color(16758095); nomecor = "laranja claro";
	} else if (cor.equals("laranja")) {
	    this.cor = new Color(16750848); nomecor = "laranja";
	} else if (cor.equals("laranja escuro")) {
	    this.cor = new Color(15035136); nomecor = "laranja escuro";
	} else if (cor.equals("vermelho claro")) {
	    this.cor = new Color(16723245); nomecor = "vermelho claro";
	} else if (cor.equals("vermelho")) {
	    this.cor = new Color(16711680); nomecor = "vermelho";
	} else {
	    this.cor = new Color(10027008); nomecor = "vermelho escuro";
	}
    }	

    /**
     * Altera a cor da Aresta em funcao do numero de rotas que passa por ela.
     * Entrada: Numero de rotas que passa pelo trecho
     * Saida: Aresta com cor alterada
     **/
    public void setCor(int flag) {
	if (flag == 1) {
	    switch(this.cor.getRGB()) {
	    case 000000 : this.setCor("azul claro"); break;
	    case 7832572 : this.setCor("azul"); break;
	    case 255 : this.setCor("azul escuro"); break;
	    case 197539 : this.setCor("verde claro"); break;
	    case 64612 : this.setCor("verde"); break;
	    case 65280 : this.setCor("verde escuro"); break;
	    case 39168 : this.setCor("amarelo claro"); break;
	    case 16383828 : this.setCor("amarelo"); break;
	    case 16776960 : this.setCor("amarelo escuro"); break;
	    case 14404612 : this.setCor("laranja claro"); break;
	    case 16758095 : this.setCor("laranja"); break;
	    case 16750848 : this.setCor("laranja escuro"); break;
	    case 15035136 : this.setCor("vermelho claro"); break;
	    case 16723245 : this.setCor("vermelho"); break;
	    case 16711680 : this.setCor("vermelho escuro"); break;		 
	    }
	} else {
	    switch(this.cor.getRGB()) {
	    case 7832572 : this.setCor("preto"); break;
	    case 255 : this.setCor("azul claro"); break;
	    case 197539 : this.setCor("azul"); break;
	    case 64612 : this.setCor("azul escuro"); break;
	    case 665280 : this.setCor("verde claro"); break;
	    case 39168 : this.setCor("verde"); break;
	    case 16383828 : this.setCor("verde escuro"); break;
	    case 16776960 : this.setCor("amarelo claro"); break;
	    case 14404612 : this.setCor("amarelo"); break;
	    case 16758095 : this.setCor("amarelo escuro"); break;
	    case 16750848 : this.setCor("laranja claro"); break;
	    case 15035136 : this.setCor("laranja"); break;
	    case 16723245 : this.setCor("laranja escuro"); break;
	    case 16711680 : this.setCor("vermelho claro"); break;
	    case 10027008 : this.setCor("vermelho"); break;		 
	    }
	}
    }
    
    /**
     * Devolve a cor da Aresta
     * Entrada: Nenhuma
     * Saida: Cor da Aresta
     **/
    public Color getCor() {
	return cor;
    }
    
    /**
     * Devolve o nome da cor
     * Entrada: Nenhuma
     * Saida: Nome da cor da aresta
     **/
    public String getNomecor() {
	return nomecor;
    }
    
    /**
     * Altera o atributo vertice inicial para o valor passado como parametro.
     * Entrada: Novo vertice inicial 
     * Saida: Nenhuma
     **/
    public void setVerticeInicial(VerticeImpl Novo_Vertice) {
	verticeInicial = Novo_Vertice;
    }
    
    /**
     * Altera o atributo vertice final para o valor passado como parametro.
     * Entrada: Novo vertice final
     * Saida: Nenhuma
     **/
    public void setVerticeFinal(VerticeImpl Novo_Vertice) { 
	verticeFinal = Novo_Vertice;
    }
    
    /**
     * Devolve o atributo vertice inicial do objeto em uso.
     * Entrada: Nenhuma
     * Saida: Vertice Inicial da Aresta
     **/
    public VerticeImpl getVerticeInicial() {
	return verticeInicial;
    }
    
    /**  
     * Devolve o atributo vertice final do objeto em uso.
     * Entrada: Nenhuma
     * Saida: Vertice final da Aresta
     **/ 
    public VerticeImpl getVerticeFinal() {
	return verticeFinal;
    }
    
    /**
     * Devolveo trecho equivalente desta aresta
     * Entrada: Nenhuma
     * Saida: O trecho que esta aresta desenha
     **/
    public Trecho getTrechoEquivalente() {
	return trechoEquivalente;
    }
    
    /**
     * Altera o valor do vertice inicial e final por um fator entrado
     **/
    public void multInicial(float fator) {
	verticeInicial.multiplicaCoordenada(fator);
    }
    public void multFinal(float fator) {
	verticeFinal.multiplicaCoordenada(fator);
    }
    
    /**
     * Altera os valores dos X e Y dos vertices iniciais e finais
     **/
    public void setInicialX(int x) {
	verticeInicial.setX(x);
    }
    public void setInicialY(int x) {
	verticeInicial.setY(x);
    }
    public void setFinalX(int x) {
	verticeFinal.setX(x);
    }
    public void setFinalY(int x) {
	verticeFinal.setY(x);
    }
    
    /**
     * Realça a cor da aresta
     * Entrada: Nenhuma
     * Saida: Booleano informando se a aresta foi ou não realçada.
     **/
    public boolean Realcar() {
	if (realce) {
	    realce = false;
	} else {
	    realce = true;
	};
	return realce;
    }

    /**
     * Retorna TRUE se a aresta estiver realçada e FALSE caso contrário.
     * Entrada: Nada
     * Saida: Um valor booleano.
     **/
    public boolean GetRealce() {
	return realce;
    }
    
    /**
     * Retorna a cor de realce.
     * Entrada: Nenhuma
     * Saida: A cor de aresta realçada
     **/
    public Color GetCorRealce() {
	return corRealce;
    }

}// fim de ArestaImpl













