package escrim.test.gestioncolis;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Test;

import escrim.gestioncolis.model.bean.Colis;
import escrim.gestioncolis.model.bean.ProfilIntervention;
import escrim.gestioncolis.model.concret.ProfilInterventionDAO;
 
public class ProfilInterventionDAOTest extends ProfilInterventionDAO {

    //Objet log de cette class
    private static final Logger loggerProfilInterventionDAOTest = Logger.getLogger(ProfilInterventionDAOTest.class);
    
    /**
     * Test pour Retourner le volume total des colis contenu dans un profil d'intervention désigner par son id
     * @param void
     * @return void
     * @author Aurélie GUY
     */
    @Test
    public void testsumVolumeProfInter() 
    {
        //Initialisation des valeurs de tests
        double vol=sumVolumeProfInter(1);
        double volVrai=0;
        
        List<Colis> c=findListeColisVolume(1);
        
         //Test avec la valeur vraie
             //Nombre de retour
         if(c.size()!=6)
         {
             fail("Il n'a pas trouvé le bon nombre de colis");
         }
        
             //Calcul du volume réel
         for(int i=0;i<c.size();i++)
        {
            volVrai=volVrai+c.get(i).getVolumeTotal();
        }
       
            //Valeur des retours
        if(vol==volVrai)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"Le volume est le bon");
        }
        else
        {
            fail("Il n'a pas trouvé le bon volume");
        }
    }
    
    
    /************************************************
     * Test pour Methode pour créer une liste d'id colis, à partir d'un id_profil, returner par décroissance de leur volume
     * {@code ELECT Colis_id_colis 
     * FROM colis_has_profil_intervention
     * WHERE Profil_Intervention_id_Profil_Intervention =idProfInt;
     * }
     * @param void
     * @return void
     * @author Aurélie GUY
     **********************************************/
    @Test
    public void testFindListeColisVolume() 
    {
        //Initialisation des valeurs de tests
        List<Colis> c=findListeColisVolume(2);
        
        //Test avec la valeur vraie
           //Nombre de retour
        if(c.size()!=1)
        {
            fail("Il n'a pas trouvé le bon nombre de colis");
        }
        
            //Valeur des retours
        if(c.get(0).getId()==16)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été trouvé");
        }
        else
        {
            fail("Il n'a pas trouvé le(s) bon(s) colis");
        }
    }
       
	/**************************************************
     * Test Ajout un colis à un profil d'intervention à partir 
     * de l'id_profil_interv voulu et un List d'ic_colis à ajouter
     * cela se traduit par l'ajout d'une entrée dans la table colis_has_profil_intervention avec ces deux id
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testUpdateListeColis() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> cliste=findListeColis(2);
	    List<Long> cAjout = new ArrayList<Long>();
	
	    cAjout.add((long)28);
        ProfilIntervention c=new ProfilIntervention(1000000,"Profil Pro",cliste);
        ProfilIntervention c1=create(c);
        long id=c1.getId();
        
        //Test de la mise à jour
        c1.setListeColis(updateListeColis(cAjout,id));
        
        boolean idtrouve=false;
        
        for(int i=0; i<c1.getListeColis().size(); i++)
        {
            if(c1.getListeColis().get(i)==28)
            {
                idtrouve=true;
            }
        }
        
        if(idtrouve)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été ajouté");
        }
        else
        {
            fail("L'élément n'est pas ajouté");
        }
        
        //Suppression des objets
        delete(c1);
	}

	/**************************************************
     * Test Supprime les entrée, associé à un idProfInt de la table colis_has_profil_intervention
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testDeleteListeColis() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> cliste=findListeColis(5);
        ProfilIntervention c=new ProfilIntervention(15,"Absss Normale",cliste);
        ProfilIntervention c1=create(c);
            
        long id=c1.getId();
        
        //Test de la suppression
        deleteListeColis(id);
        
        if(find(id).get(0).getListeColis().isEmpty())
        {
                loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été supprimé");
        }
        else
        {
            fail("L'élément n'est pas supprimé");
        }
        
        //Suppression des objets
        delete(c1);
	}

	/**************************************************
     * Test Methode pour créer une liste d'id colis, à partir d'un id_profil
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testFindListeColis() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> c=findListeColis(1);
	    long cVrai=92;
        
	    //Test de la valeur vrai
	        //Nombre de retour
        if(c.size()==6)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"Il y a bien le nombre voulu de colis avec le bon id profilIntervention.");
        }
        else
        {
            fail("La liste est vide ou incomplète");
        }
        
            //Valeur des retours
        if(c.get(3)==cVrai)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément qui existe a l'indice 3 est bien trouvé");
        }
        else
        {
            fail("L'élément qui existe a l'indice 3 n'est pas le bon");
        }
	}

	/**************************************************
     * Test Requête pour recupèrer un ProfilIntervention en fonction de l'ID colis
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testFindLong() {
	    //Initialisation des valeurs de tests
	    List<ProfilIntervention> c=find(1);
        List<Long> cliste=findListeColis(1);
        ProfilIntervention cc=new ProfilIntervention(1,"Normal",cliste);
        
        //Test de la valeur vrai
            //Nombre de retour
        if(c==null)
        {
            fail("La liste est vide");
        }
        
            //Valeur des retours
        if(c.get(0).getId()==cc.getId() && c.get(0).getNomProfil().equals(cc.getNomProfil())
                && c.get(0).getListeColis().equals(cc.getListeColis()) 
                )
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément qui existe a l'indice 1 est bien trouvé");
        }
        else
        {
            fail("L'élément qui existe a l'indice 1 n'est pas le bon");
        }
	}

	/**************************************************
     * Test Requête pour lister tous les ProfilIntervention de la table ProfilIntervention
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testFind() 
	{
	    //Initialisation des valeurs de tests
	    List<ProfilIntervention> c=find();
	    List<Long> cliste=findListeColis(1);
	    ProfilIntervention cc=new ProfilIntervention(1,"Normal",cliste);
	    
        //Test de la valeur vrai
	        //Nombre de retour
        if(c==null)
        {
            fail("La liste est vide");
        }
        
            //Valeur des retours
        if(c.get(0).getId()==cc.getId() && c.get(0).getNomProfil().equals(cc.getNomProfil())
                && c.get(0).getListeColis().equals(cc.getListeColis()) 
                )
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément qui existe a l'indice 1 est bien trouvé");
        }
        else
        {
            fail("L'élément qui existe a l'indice 1 n'est pas le bon");
        }
	}

	/**************************************************
     * Test Requête pour recupèrer un ProfilIntervention en fonction de son id_colis, dlu et design_commercial
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testFindString() 
	{
	    //Initialisation des valeurs de tests
	    List<ProfilIntervention> c=find("Normal");
        List<Long> cliste=findListeColis(1);
        ProfilIntervention cc=new ProfilIntervention(1,"Normal",cliste);
        
        //Test de la valeur vrai
            //Nombre de retour
        if(c==null)
        {
            fail("La liste est vide");
        }
        
            //Valeur des retours
        if(c.get(0).getId()==cc.getId() && c.get(0).getNomProfil().equals(cc.getNomProfil())
                && c.get(0).getListeColis().equals(cc.getListeColis()) 
                )
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément qui existe a l'indice 1 est bien trouvé");
        }
        else
        {
            fail("L'élément qui existe a l'indice 1 n'est pas le bon");
        }
	}

	/**************************************************
     * Test Requête pour ajouter un ProfilIntervention (voir interface : Ajouter ProfilIntervention(s))
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testCreateProfilIntervention() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> cliste=findListeColis(1);
	    ProfilIntervention c=new ProfilIntervention(15,"Absence Normale",cliste);
        
	    //Test de création possible
	    ProfilIntervention c1=create(c);
       
	        //Nombre de retour
        if(c1==null)
        {
            fail("L'élément est créé.");
        }
        else
        {
loggerProfilInterventionDAOTest.log(Level.INFO,"La liste n'est pas vide car l'élément existe");
        }
            
        long id=c1.getId();
        
            //Valeur des retours
        if(c1.getId()==id && c1.getNomProfil().equals(c.getNomProfil())
                && c1.getListeColis().equals(c.getListeColis())
                )
        {
loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été créé");
        }
        else
        {
            fail("L'élément n'a pas bien été créé");
        }
        
        //Suppression des objets
        delete(c1);
	}

	/**************************************************
	 * Test Recupère l'id du dernier profil d'intervention créer
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
    
    @Test
    public void testfindLastProfInter() 
    {
        loggerProfilInterventionDAOTest.log(Level.INFO,"Appel de testFindLast()");
        
        //Initialisation des valeurs de tests
        long id=findLastProfInter();
        long idDernier=6;
        
        //Test de la valeur vrai
        if(id==idDernier)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"Il a récupéré le bon ID");
        }
        else
        {
            fail("Il a récupéré le bon ID");
        }
    }	
	
	/**************************************************
     * Test Requête pour mettre à jour un ProfilIntervention passer en paramètre
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testUpdateProfilIntervention() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> cliste=findListeColis(2);
        ProfilIntervention c=new ProfilIntervention(8888,"Profil",cliste);
        ProfilIntervention c1=create(c);
        long id=c1.getId();
        ProfilIntervention cNew=new ProfilIntervention(id,"Profil Nouveau",cliste);
        c1=update(cNew);
        
        //Test de la valeur vrai
            //Nombre de retour
        if(c1==null)
        {
            fail("La liste est vide");
        }
        
            //Valeurs de retours
        if(c1.getId()==id && c1.getNomProfil().equals(cNew.getNomProfil()))
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été mis à jour");
        }
        else
        {
            fail("L'élément n'a pas bien été mis à jour");
        }
        
        //Suppression des objets
        delete(c1);
	}

	/**************************************************
     * Test Requête pour supprimer le ProfilIntervention à l'id indique
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	
	@Test
	public void testDeleteProfilIntervention() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> cliste=findListeColis(2);
	    long id=findLastProfInter()+1;
        ProfilIntervention c=new ProfilIntervention(id,"Abs Profil",cliste);
        ProfilIntervention c1=create(c);
        
        //Test de suppression
        int i=delete(c1);
        
        if(find(id).isEmpty() && i!=0)
        {
            loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été supprimé");
        }
        else
        {
            fail("L'élément n'est pas supprimé");
        }
	}

	/**************************************************
     * Test Requête pour supprimer tous les ProfilInterventions
     * @param void
     * @return void
     * @author Aurélie GUY
     **************************************************/
	 
	@Test
	public void testDeleteListeProfil() 
	{
	    //Initialisation des valeurs de tests
	    List<Long> cliste=findListeColis(2);
	    cliste.add((long)28);
        long id=findLastProfInter()+1;
        ProfilIntervention c=new ProfilIntervention(id,"Abs Proil",cliste);
        
        ProfilIntervention c1=create(c);
        
        id=c1.getId();
        
        //Test de suppression
        deleteListeProfil(28);
        
        boolean idtrouve=false;
        
        for(int i=0; i<find(id).size(); i++)
        {
            if(find(id).get(i).getId()==28)
            {
                idtrouve=true;
            }
        }
        
        if(!idtrouve)
        {
loggerProfilInterventionDAOTest.log(Level.INFO,"L'élément a bien été supprimé");
        }
        else
        {
            fail("L'élément n'est pas supprimé");
        }
        
        //Suppression des objets
        delete(c1);
        find(1).get(0).getListeColis().add((long)28);
	}
}
