package com.tn.parser;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;

import com.tn.entity.Monument;
 

public class XMLDOMParser {
	
	
	 // XML node names
    static final String NODE_MONUMENT = "monument";
    
    //context de l'activity 
    private Context context;
	
	//Constructeur 
    public XMLDOMParser(Context context) {
		this.context = context;
	}
    
    
    //Returns the entire XML document 
    public Document getDocument(InputStream inputStream) {
        Document document = null;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = factory.newDocumentBuilder();
            InputSource inputSource = new InputSource(inputStream);
            document = db.parse(inputSource);
        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }
        return document;
    }
 
    
    
  //cette fonction retourne aléatoirement un objet Monument contenant son nom et  pays 
   public Monument getRandomImage(int [] listId){
	   
	   AssetManager manager = context.getAssets();
       InputStream stream;
       
       //declarer le monument a instancier
       Monument monument = null;
       
       try {
    	   //ouvrie le fichier xml
           stream = manager.open("monument.xml");
           Document doc = getDocument(stream);

           
           //liste des noeuds monument
           NodeList listMonument = doc.getElementsByTagName(NODE_MONUMENT);

           //prendre un entier au hazard entre 0 et et la taille des elements -1
           int randomInt = auHasard(listId, listMonument.getLength()-1);
           
           //saisir l'element concerné
           Element monumentElement = (Element) listMonument.item(randomInt);
           
           
           //Instancier l'objet et lui affecter les valeurs necessaires
           monument = new Monument();
           monument.setNomMonument(monumentElement.getAttribute("nom"));
           monument.setPaysMonument(monumentElement.getAttribute("pays"));
           monument.setIdMoument(randomInt);
           
           //retourner l'objet
           return monument;
          
           
       } catch (IOException e1) {
           e1.printStackTrace();
       }
	   
       //en cas d'exception on retroune null
       return null;
    }
    
    
 //cette fonction retourne  un objet Monument contenant son nom et  pays avec son id en mis en parametre
   public Monument getMonument(int idMonument){
	   
	   AssetManager manager = context.getAssets();
       InputStream stream;
       
       //declarer le monument a instancier
       Monument monument = null;
       
       try {
    	   //ouvrie le fichier xml
           stream = manager.open("monument.xml");
           Document doc = getDocument(stream);

           
           //liste des noeuds monument
           NodeList listMonument = doc.getElementsByTagName(NODE_MONUMENT);

           
           //saisir l'element concerné
           Element monumentElement = (Element) listMonument.item(idMonument);
           
           
           //Instancier l'objet et lui affecter les valeurs necessaires
           monument = new Monument();
           monument.setNomMonument(monumentElement.getAttribute("nom"));
           monument.setPaysMonument(monumentElement.getAttribute("pays"));
           monument.setIdMoument(Integer.parseInt(monumentElement.getAttribute("id")));
           monument.setIdPays(Integer.parseInt(monumentElement.getAttribute("id_pays")));
           
           //retourner l'objet
           return monument;
          
           
       } catch (IOException e1) {
           e1.printStackTrace();
       }
	   
       //en cas d'exception on retroune null
       return null;
    }

   
   
   //retourne un entier au hasard entre une valeur min et max
   public int auHasardEntre (int max , int min ){        
	   int resultat = (int) ((max-min) * Math.random() + min) ;
   return resultat;
   }


   //retourne un entier alétoirement different de ceux contenant dans le tableau mis en parametre
   public int auHasard(int [] tab_int, int max){
	   int resultat = auHasardEntre(0, max) ;
	   while(contain(tab_int, resultat)){
		   resultat = auHasardEntre(max, 0) ;
	   }
	   return resultat;
   }
   
   private boolean contain(int [] tab_int , int entier){
	   for (int i = 0 ; i < tab_int.length ; i++)
		   if(tab_int[i] == entier)
			   return true;
	   
	   return false;
   }

   
   //retourne le nombre de monument
   public int getNombreMonument(){
	   AssetManager manager = context.getAssets();
       InputStream stream;
       
       
       try {
    	   //ouvrie le fichier xml
           stream = manager.open("monument.xml");
           Document doc = getDocument(stream);

           
           //liste des noeuds monument
           NodeList listMonument = doc.getElementsByTagName(NODE_MONUMENT);

           
           return  listMonument.getLength();
           
          
           
       } catch (IOException e1) {
           e1.printStackTrace();
       }
	   
       //en cas d'exception on retroune 0
       return 0;

   }
   
   
}