package testUnitaire.database.migration.etape3;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import junit.framework.Assert;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import database.dataset.Encaissement;
import database.dataset.Facture;
import database.dataset.Modedepaiement;
import database.migration.SqlFactory;
import database.migration.etape0.modeDePaiement.ReadModeDePaiement;
import database.migration.etape2.facture.NormalisedFacture;
import database.migration.etape2.facture.ReadFacture;
import database.migration.etape3.encaissement.ReadEncaissement;

public class testEncaissement {
	private static Connection connection;
	private static NormalisedFacture _facture_lst;
	private static List<Modedepaiement> _mode_paiement_list;
	private static List<Encaissement> _encaissement_lst;
	
	@BeforeClass
	public static void connecte() throws FileNotFoundException, SQLException, IOException{
		connection = SqlFactory.connect(SqlFactory.loadProperties("hotel_orford_import.xml"));
		
		System.out.println("dependance importation des facture");
		_facture_lst =  ReadFacture.normaliseTaxe(ReadFacture.from(connection));
		System.out.println("dependance importation des type de paiement");
		_mode_paiement_list =  ReadModeDePaiement.from(connection);
		
		System.out.println("importation des encaissement");
		_encaissement_lst = ReadEncaissement.from(connection);
	}
	
	@AfterClass
	public static void deconnecte() throws SQLException{
		connection.close();
	}
	
	@Test
	public void verifier_quil_ny_a_pas_de_zero_dans_facture_fk_id(){
		for (Encaissement e : _encaissement_lst){
			assertFalse("encaissement "+e.getencaissement_p_id(),e.getFacture_fk_id()==0);
		}
	}

	@Test
	public void verifier_quil_ny_a_pas_de_zero_dans_modedepaiement_fk_id(){
		for (Encaissement e : _encaissement_lst){
			assertFalse("encaissement "+e.getencaissement_p_id(),e.getModedepaiement_fk_id()==0);
		}
	}
	
	@Test
	public void verifier_integrite_referentiel_de_facture_fk_id(){
		for (Encaissement e : _encaissement_lst){
			boolean ok=false;
			for (Facture f : _facture_lst.getFactures()){
				ok |= f.getFacture_p_id()==e.getFacture_fk_id();
			}
			assertTrue("encaissement "+e.getencaissement_p_id(),ok);
		}
	}
	
	@Test
	public void verifier_integrite_referentiel_de_modedepaiement_fk_id(){
		for (Encaissement e : _encaissement_lst){
			boolean ok=false;
			for (Modedepaiement m : _mode_paiement_list){
				ok |= m.getmodedepaiement_p_id()==e.getModedepaiement_fk_id();
			}
			assertTrue("encaissement "+e.getencaissement_p_id(),ok);
		}
	}
	
	@Test 
	public void verifier_que_personne_na_ete_oublier() throws SQLException{
		Statement stm = connection.createStatement();
		ResultSet rs = stm.executeQuery("SELECT ID FROM encaissement");
		while(rs.next()){
			boolean ok = false;
			for (Encaissement e : _encaissement_lst){
				if (e.getencaissement_p_id()==rs.getInt("ID")){
					ok=true;
				}
			}
			Assert.assertTrue("missing encaissement n " + rs.getInt("ID"), ok);
		}
	}
}
