#include <iostream>
#include <fstream>
#include <list>

#include <Erros/erros.H>

#include "filme.H"
#include "outros_filmes.H"

using namespace std;

int main() 
try {
    cout << "Filmes construídos a partir de ficheiro: " << endl;

    ifstream entrada("filmes.txt");

    Filme filme(entrada);
    FilmeEstrangeiro filme_estrangeiro(entrada);
    EdicaoDoRealizador edicao_do_realizador(entrada);

    filme.mostraEm(cout);
    filme_estrangeiro.mostraEm(cout);
    edicao_do_realizador.mostraEm(cout);

    entrada.close();

    cout << endl
	 << "Filmes construídos directamente: " << endl;

    Filme novo_filme("Aniki Bóbó", "Manoel de Oliveira", 102);
    FilmeEstrangeiro novo_filme_estrangeiro("Dancer in the Dark", 
					    "Lars von Trier", 140,
					    "Dinamarca", "Inglês");
    EdicaoDoRealizador nova_edicao_do_realizador("Idi i smotri (Vem e vê)",
						 "Elem Klimov", 142, 
						 "Nenhumas...");

    novo_filme.mostraEm(cout);
    novo_filme_estrangeiro.mostraEm(cout);
    nova_edicao_do_realizador.mostraEm(cout);

    cout << endl
	 << "Filmes carregados a partir de ficheiro: " << endl;

    entrada.open("filmes.txt");

    novo_filme.carregaDe(entrada);
    novo_filme_estrangeiro.carregaDe(entrada);
    nova_edicao_do_realizador.carregaDe(entrada);

    novo_filme.mostraEm(cout);
    novo_filme_estrangeiro.mostraEm(cout);
    nova_edicao_do_realizador.mostraEm(cout);

    cout << endl
	 << "Filmes dinâmicos em lista: " << endl;

    list<Filme*> lista_de_filmes;

    lista_de_filmes.push_back(new Filme("Aniki Bóbó", 
					"Manoel de Oliveira", 
					102));
    lista_de_filmes.push_back(new FilmeEstrangeiro("Dancer in the Dark", 
						   "Lars von Trier", 140,
						   "Dinamarca", "Inglês"));
    lista_de_filmes.push_back(new EdicaoDoRealizador("Idi i smotri (Vem e vê)",
						     "Elem Klimov", 142, 
						     "Nenhumas..."));
    
    for(list<Filme*>::iterator i = lista_de_filmes.begin(); 
	i != lista_de_filmes.end(); ++i)
	(*i)->mostraEm(cout);
			      
} catch(Erros::Erro& erro) {
    cerr << string(erro) << endl;
}