#ifndef FILME_H
#define FILME_H

#include <iosfwd>
#include <string>

/** Representa filmes. 
    @invariant 0 <= duracao_. */
class Filme {
public:
    /** Constrói novo filme com nome, realizador e duração dados.
	@pre 0 <= duracao.
	@post nome() = nome e realizador() = realizador e duracao() =
	duracao. */
    Filme(std::string const& nome, std::string const& realizador,
	  int duracao);

    /** Constrói novo filme com informação extraída do canal de
	entrada. 
	@pre entrada.
	@post *this tem informação extraída do canal de entrada. */
    explicit Filme(std::istream& entrada);
    
    /** Devolve o nome do filme.
	@pre V.
	@post nome = nome do filme. */
    std::string const& nome() const;

    /** Devolve o realizador do filme.
	@pre V.
	@post realizador = realizador do filme. */
    std::string const& realizador() const;

    /** Devolve a duração do filme.
	@pre V.
	@post duracao = duração do filme. */
    int duracao() const;
    
    /** Mostra informação sobre o filme no canal dado num formato
	agradável à vista.
	@pre V.
	@post saida contém a informação sobre o filme. */
    void mostraEm(std::ostream& saida) const;

    /** Guarda informação sobre o filme no canal dado num formato
	apropriado a futuros carregamentos.
	@pre saida.
	@post saida contém a informação sobre o filme. */
    // void guardaEm(std::ostream& saida) const;

    /** Le informação sobre o filme do canal dado assumindo que este
	está ligado a um ser humano (e.g., leitura do teclado).
	@pre V.
	@post *this contém a informação sobre o filme lida do canal de
	entrada. */
    // void leDe(std::istream& entrada);

    /** Carrega informação sobre o filme do canal dado assumindo que este
	está ligado no formato usado pela operação carrega().
	@pre entrada.
	@post *this contém a informação sobre o filme carregada do canal de
	entrada. */
    void carregaDe(std::istream& entrada);
    
private:
    std::string nome_;
    std::string realizador_;
    int duracao_;

    /** Indica se a condição invariante da classe se verifica.
	@pre V.
	@post cumpreInvariante = 0 <= duracao_. */
    bool cumpreInvariante() const;
};

#include "filme_impl.H"

#endif // FILME_H