package jm14.ant.model.db;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import jm14.ant.model.Artigo;
import jm14.ant.model.ArtigosHome;

public class ArtigosHomeImpl implements ArtigosHome {

	private String jdbcDriver = null;
	private String jdbcUrl = null;
	private String jdbcUser = null;
	private String jdbcPassword = null;

	private static final String SELECT = 
		"SELECT Artigos.Titulo, Artigos.Resumo, Autores.Nome FROM  " +
		"Artigos, Autores WHERE Artigos.AutorId = Autores.ID AND Artigos.Edicao = ?";
	

	public ArtigosHomeImpl( String arquivoProperties ) {
		// OBS: tratamento de excecao ignorado para simplificar o exemplo
		
		try {
			InputStream stream = getClass().getClassLoader().getResourceAsStream( arquivoProperties );
			if ( stream == null ) {
				throw new RuntimeException( "Arquivo de propriedades " + arquivoProperties + " nao encontrado no classpath" );
			}
			Properties properties = new Properties();
			properties.load( stream );
			this.jdbcDriver = properties.getProperty( "jm14.ant.jdbc.driver" );
			this.jdbcUrl = properties.getProperty( "jm14.ant.jdbc.url" );
			this.jdbcUser = properties.getProperty( "jm14.ant.jdbc.user" );
			this.jdbcPassword = properties.getProperty( "jm14.ant.jdbc.password" );
			Class.forName( this.jdbcDriver );
		} catch (ClassNotFoundException e) {
			throw new RuntimeException( "Driver JDBC nao encontrado no classpath: " + this.jdbcDriver );
		} catch (IOException e) {
			throw new RuntimeException( "Erro lendo arquivo de propriedades " + arquivoProperties );
		}
	}
	

	public List listaArtigosPorEdicao(int edicao) {
		// OBS: tratamento de excecao ignorado para simplificar o exemplo
		List artigos = new ArrayList();
		try {
			Connection conn = DriverManager.getConnection( this.jdbcUrl, this.jdbcUser, this.jdbcPassword );
			PreparedStatement pstmt = conn.prepareStatement( SELECT );
			pstmt.setInt( 1, edicao );
			ResultSet rs = pstmt.executeQuery();
			Artigo artigo = null;
			while ( rs.next() ) {
				artigo = new Artigo();
				artigo.setTitulo( rs.getString(1) );
				artigo.setResumo( rs.getString(2) );
				artigo.setAutor( rs.getString(3) );
				artigos.add( artigo );
			}
			return artigos;
		} catch( SQLException exc ) {
			exc.printStackTrace();
			throw new RuntimeException( "Erro de banco:  " + exc.getMessage() );
		}
		
	}

}
