/*
 * Desenvolvido para a disciplina Programacao 1
 * Curso de Bacharelado em Ciência da Computação
 * Departamento de Sistemas e Computação
 * Universidade Federal da Paraíba
 *
 * Copyright (C) 1999 Universidade Federal da Paraíba.
 * Não redistribuir sem permissão.
 */

import p1.aplic.geral.Data;

/**
 * Classe que representa uma mensagem normal de correio eletronico.
 *
 * Uma mensagem contém um remetente, um assunto uma data de envio e algum conteúdo.
 * O conteúdo depende do tipo exato de mensagem (textual, áudio).
 * Uma mensagem pode ser exibida (lida) e marcada para exclusão.
 *
 * @author   Jacques Philippe Sauvé, jacques@dsc.ufpb.br
 * @version 1.1
 * <br>
 * Copyright (C) 1999 Universidade Federal da Paraíba.
 */

public class Mensagem {
    private static final int LIDA = 0x1;
    private static final int EXCLUÍDA = 0x2;
    private static final int NOVA = ~(LIDA | EXCLUÍDA);

    private String  remetente;
    private String  assunto;
    private String  conteúdo;
    private Data    dataEnvio;
    private int     estado;

    public Mensagem(String remetente, String assunto, String conteúdo) {
        this.remetente = remetente;
        this.assunto = assunto;
        this.conteúdo = conteúdo;
        dataEnvio = new Data();
        estado = NOVA;
    }

    /**
     * Recupera o remetente da mensagem
     * @return O remetente da mensagem
     */
    public String getRemetente() {
        return remetente;
    }

    /**
     * Recupera o assunto da mensagem
     * @return O assunto da mensagem
     */
    public String getAssunto() {
        return assunto;
    }

    /**
     * Recupera o conteúdo da mensagem
     * @return O conteúdo da mensagem
     */
    public String getConteúdo() {
        return conteúdo;
    }

    /**
     * Recupera a data de envio da mensagem
     * @return A data de envio da mensagem
     */
    public Data getDataEnvio() {
        return dataEnvio;
    }

    /**
     * Informa se a mensagem foi lida ou não
     * @return true se a mensagem foi lida, false caso contrário
     */
    public boolean isLida() {
        return (estado & LIDA) == LIDA;
    }

    /**
     * Informa se a mensagem foi excluída ou não
     * @return true se a mensagem foi excluída, false caso contrário
     */
    public boolean isExcluída() {
        return (estado & EXCLUÍDA) == EXCLUÍDA;
    }

    /**
     * Marcar a mensagem como excluída.
     * A exclusão deve ser feita pela coleção que armazena as mensagens.
     * Um exemplo de tal coleção é CaixaPostal.
     */
    public void excluir() {
        estado |= EXCLUÍDA;
    }

    /**
     * Marcar a mensagem como não excluída.
     */
    public void marcarNãoExcluída() {
        estado &= ~EXCLUÍDA;
    }

    /**
     * Marcar a mensagem como não lida.
     */
    public void marcarNãoLida() {
        estado &= ~LIDA;
    }

    /**
     * Testa a igualdade de um objeto com esta mensagem.
     * @param objeto O objeto a comparar com esta mensagem.
     * @return true se o objeto for igual a esta mensagem, false caso contrário.
     */
    public boolean equals(Object objeto) {
        if(! (objeto instanceof Mensagem)) {
            return false;
        }
        Mensagem outra = (Mensagem)objeto;
        return getRemetente().equals(outra.getRemetente())
                && getAssunto().equals(outra.getAssunto())
                && getConteúdo().equals(outra.getConteúdo());
    }

    /**
     * Exibir a mensagem. Os dados da mensagem são apresentados na saída padrão.
     * Após este método, a mensagem é considerada "lida".
     */
    public void exibir() {
        System.out.println("De: " + remetente);
        System.out.println("Data: " + dataEnvio.DDMMAAAAHHMM());
        System.out.println("Assunto: " + assunto);
        System.out.println(conteúdo);
        estado |= LIDA;
    }

    /**
     * Forneça uma representação da mensagem como String
     * @return A representação da mensagem como String.
     */
    public String toString() {
        return "Remetente: " + remetente +
               ", Data: " + dataEnvio.DDMMAAAAHHMM() +
               ", Assunto: " + assunto +
               ", Conteúdo: " + conteúdo;
    }
}

