package testUnitaire.database.migration.etape1;

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

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

import junit.framework.Assert;

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

import database.dataset.Chambre;
import database.dataset.Reservation;
import database.dataset.Status_chambre;
import database.migration.SqlFactory;
import database.migration.etape0.status_chambre.ReadStatusChambre;
import database.migration.etape1.chambre_reserv_reparation.NormalisedChambre;
import database.migration.etape1.chambre_reserv_reparation.ReadChambre;

public class testNormalisedChambreAndStatus_chambre{
	private static java.sql.Connection connection;
	private static NormalisedChambre normalisedChambre;
	private static List<Status_chambre> readStatus_chambre;
	
	@BeforeClass
	public static void init() throws FileNotFoundException, SQLException, IOException{
		connection = SqlFactory.connect(SqlFactory.loadProperties("hotel_orford_import.xml"));
		normalisedChambre = NormalisedChambre.make(ReadChambre.from(connection));
		readStatus_chambre = ReadStatusChambre.from(connection);
	}
	
	@AfterClass
	public static void purge() throws SQLException{
		connection.close();
	}
	
	@Test
	public void testVoirChambre() {
		for (Chambre c : normalisedChambre.get_chambres())
			System.out.println(c.toString());
	}
	
	@Test
	public void testVoirReservation() {
		for (Reservation c : normalisedChambre.get_reservations())
			System.out.println(c.toString());
	}
	
	@Test
	public void testVoirStatusChambre() {
		for (Status_chambre c : readStatus_chambre)
			System.out.println(c.toString());
	}

	@Test
	public void testCleDupliqueChambre(){
		Set<Integer> alreadyChecked = new HashSet<Integer>();
		for (Chambre c : normalisedChambre.get_chambres())
			if (alreadyChecked.contains(c.getChambre_p_id()))
				fail("chambre duplicate key found " + c.getChambre_p_id());
			else
				alreadyChecked.add(c.getChambre_p_id());
	}
	
	@Test
	public void testCleDupliqueStatusChambre(){
		Set<Integer> alreadyChecked = new HashSet<Integer>();
		for (Status_chambre c : readStatus_chambre)
			if (alreadyChecked.contains(c.getStatus_p_id()))
				fail("status chambre duplicate key found " + c.getStatus_p_id());
			else
				alreadyChecked.add(c.getStatus_p_id());
	}
	
	@Test
	public void testCleDupliqueReservation(){
		Set<Integer> alreadyChecked = new HashSet<Integer>();
		for (Reservation c : normalisedChambre.get_reservations())
			if (alreadyChecked.contains(c.getReservation_p_id()))
				fail("status chambre duplicate key found " + c.getReservation_p_id());
			else
				alreadyChecked.add(c.getReservation_p_id());
	}
	
	@Test
	public void testDintegriterReferentielReservationChambre(){
		for (Reservation r : normalisedChambre.get_reservations()){
			boolean ok = false;
			for (Chambre c : normalisedChambre.get_chambres()){
				if (c.getChambre_p_id()== r.getChambre_fk_id()){
					ok = true;
				}
			}
			if (!ok)
				fail("echec à l'integité référentiel, chambre " + r.getChambre_fk_id() + " reservation " + r.getReservation_p_id());
		}
	}
	
	@Test
	public void testDintegriterReferentielReservationStatus(){
		for (Reservation r : normalisedChambre.get_reservations()){
			boolean ok = false;
			for (Status_chambre c : readStatus_chambre){
				if (c.getStatus_p_id()== r.getStatus_fk_id()){
					ok = true;
				}
			}
			if (!ok)
				fail("echec à l'integité référentiel, status " + r.getStatus_fk_id() + " reservation " + r.getReservation_p_id());
		}
	}
	
	@Test
	public void testQueTouteLesChambresSontLa() throws SQLException{
		Statement stm = connection.createStatement();
		ResultSet rs = stm.executeQuery("SELECT ID FROM chambre");
		while(rs.next()){
			boolean ok = false;
			for (Chambre c : normalisedChambre.get_chambres()){
				if (c.getChambre_p_id()==rs.getInt("ID")){
					ok=true;
				}
			}
			Assert.assertTrue("missing chambre n " + rs.getInt("ID"), ok);
		}
	}
	
	@Test
	public void testNotZero_reservation_chambre_fk_id(){
		for (Reservation a : normalisedChambre.get_reservations()){
			assertFalse("echec not zero chambre de reservation n " + a.getChambre_fk_id(),a.getChambre_fk_id()==0);
		}
	}
	
	@Test
	public void testNotZero_reservation_status_fk_id(){
		for (Reservation a : normalisedChambre.get_reservations()){
			assertFalse("echec not zero status de reservation n " + a.getStatus_fk_id(),a.getStatus_fk_id()==0);
		}
	}
}
