/*
 * Allocine.java, 3 févr. 2006
 * 
 * This file is part of FilmZ.
 *
 * Copyright © 2006 Johan Cwiklinski
 *
 * File :               Allocine.java
 * Author's email :     johan@x-tnd.be
 * Author's Website :   http://www.x-tnd.be/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 */

/**
 * 
 */
package be.xtnd.films.plugins;

import java.util.regex.Pattern;

/**
 * Récupération des informations d'un titre 
 * sur le site allocine.fr
 * 
 * @author Johan Cwiklinski
 */
public class Allocine extends RecupWeb {
    
	/**
	 * Cherche le titre en paramètre
	 * sur allocine.fr
	 * 
	 * @param title titre à chercher
	 */
	public Allocine(String title){
		super(
				title, 
				"http://www.allocine.fr/recherche/?motcle=[word]&rub=1",
				"<h3[^>]*><b>Films <h4>\\(([0-9]{1,4}) réponses?\\)</h4></b></h3>",
				false
		);
	}
	
	/**
	 * Cherche et traite si besoin est
	 * les pages suivantes des résultats 
	 * 
	 * @param data Données de la page en cours pour recherche du lien
	 * vers la page suivante
	 */
	protected void nextPages(StringBuffer data){
    	boolean isNext = false;
		REGEX = "<a href=[^\\\"]*\\\"(/recherche.*?)\\\"[^>]*>Films suivants</a>";
    	pattern = Pattern.compile(REGEX);
    	matcher = pattern.matcher(data);
    	while(matcher.find()){	
    		data = loadUrl("http://www.allocine.fr"+matcher.group(1));
    		parseResults(data);
    		isNext=true;
    	}		
		if(isNext) nextPages(data);
	}

	/**
	 * Parcours les résultats de la liste et les stocke
	 * dans un Object[][] pour l'affichage ultérieur dans
	 * une JTable
	 * 
	 * @param data données à parser
	 */
	protected void parseResults(StringBuffer data){
    	REGEX = "<h4><a href=[^\\\"]*\\\"(/film/fichefilm.*?)\\\"[^>]*>(.*?)</a></h4>[\\n|\\r]*<h5[^>]*>&nbsp;(.*?)</h5>(.*?)</td>";
        pattern = Pattern.compile(REGEX,Pattern.DOTALL);
        matcher = pattern.matcher(data);
        while(matcher.find()) {
    		listeReponses[current] = new Object[3];
    		String rec_url = matcher.group(1);
    		String rec_fr_title = matcher.group(2).replaceAll(rmMarks, "");
    		String rec_en_title = matcher.group(3).replaceAll(rmMarks, "");
    		REGEX = "<h4.*?>( |&nbsp;)(.*?)</h4>";
    		pattern = Pattern.compile(REGEX);
    		matcher_second = pattern.matcher(matcher.group(4));
    		StringBuffer rec_optionnals = new StringBuffer();
    		while(matcher_second.find())
    			rec_optionnals.append(" " + matcher_second.group(2));
    		
    		listeReponses[current][2] = rec_optionnals.toString();
    		listeReponses[current][1] = rec_fr_title+" "+rec_en_title;
			listeReponses[current][0] = rec_url;			        			
            current++;
        }
	}

	/**
	 * Charge la page des détails d'un film
	 * 
	 * @param url page du film à charger, récupérée normalement
	 * dans la liste des résultats de recherche
	 */
	public void loadMovie(String url){
		StringBuffer data = loadUrl("http://www.allocine.fr"+url);
		//titre
		REGEX = "<title>(.*?)</title>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			titre = matcher.group(1);
		
		//titre original
		REGEX ="<h4>Titre original : (.*?)</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			titreOriginal = matcher.group(1).replaceAll(rmMarks,"");
		
		//réalisateurs
		REGEX ="<h4>Réalisé par (.*?)</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			REGEX = "<a[^>]*>(.*?)</a>";
			pattern = Pattern.compile(REGEX);
			matcher_second = pattern.matcher(matcher.group(1));
			while(matcher_second.find())
				realisateurs.add(matcher_second.group(1));
		}
		
		//acteurs
		REGEX = "<a href=[^\\\"]*\\\"(.*?)\\\"[^>]*>Voir tout le casting...</a>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			loadActors(matcher.group(1));
		
		//origines
		REGEX = "<h4>Film (.*?).</h4>.*?<h4>Genre";
		pattern = Pattern.compile(REGEX,Pattern.DOTALL);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			String[] origs = matcher.group(1).split("\\,");
			for(int z = 0 ; z < origs.length ; z++)
				origines.add(origs[z].trim());
		}
		
		//genres
		REGEX = "<h4>Genre : (.*?)</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			REGEX = "<a[^>]*>(.*?)</a>";
			pattern = Pattern.compile(REGEX);
			matcher_second = pattern.matcher(matcher.group(1));
			while(matcher_second.find())
				genres.add(matcher_second.group(1));
		}
		
		//durée
		REGEX = "<h4>Durée : ([0-9])h.([0-9]{1,2}).*</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			duree = new Integer(matcher.group(1))*60+new Integer(matcher.group(2));
		}
		
		//année de production
		REGEX = "<h4>Année de production : ([0-9]{4})</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			anneeProduction = new Integer(matcher.group(1));
		
		//année de sortie
		REGEX = "<h4>Date de sortie : <[/]?[^>]+>.*?([0-9]{4})<[/]?[^>]+>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			anneeSortie = new Integer(matcher.group(1));
		
		//synopsis
		int debutSynopsis = 0;
		int finSynopsis = 0;
		//début...
		REGEX = "<h3[^>]*><b>Synopsis</b></h3>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			debutSynopsis = matcher.end();
		
		//fin...
		REGEX = "<td[^>]*><h3[^>]*><b>Bandes-annonces</b></h3></td></tr>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			finSynopsis = matcher.start();

		
		REGEX = "<([a-z][a-z0-9]*)[^>]*><div align=\"justify\"><h4>(.*?)</h4></div></\\1>";
		pattern = Pattern.compile(REGEX,Pattern.DOTALL);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			if(matcher.start()>debutSynopsis
					&& matcher.end()<finSynopsis)
				synopsis = matcher.group(2).replaceAll("<br?[^>][/]?[^>]+>", "\n").replaceAll(rmMarks, "");
		}		
	}
	
	/**
	 * Charge la page de casting du film,
	 * récupère et stocke les acteurs dans un 
	 * ArrayList
	 *  
	 * @param url url de la page casting
	 */
	protected void loadActors(String url){
		StringBuffer data = loadUrl("http://www.allocine.fr"+url);
		//début
		int debut = 0;
		REGEX = "<td[^>]*><h4[^>]*><b>Acteur\\(s\\)</b></h4><hr /></td>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			debut = matcher.end();
		
		//fin
		int end = 0;
		REGEX = "<td[^>]*><h4[^>]*><b>.*?</b></h4><hr /></td>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			if(matcher.end()>debut){
				System.err.println(matcher.group(0));
				end = matcher.end();
				break;
			}
		}
		
		System.err.println("début "+debut+", fin "+end);
		
		//acteurs
		REGEX = "<h5><a href=[^\\\"]*\\\"(/personne/fichepersonne.*?)\\\"[^>]*>(.*?)</a>.*?</h5>";
		//REGEX = "<h4><a href=[^\\\"]*\\\"(/personne/fichepersonne.*?)\\\"[^>]*><h4>(.*?)</h4></a>.*?</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			if(matcher.start()>debut && matcher.start()<end){
				acteurs.add(matcher.group(2));
			}
		}
		acteurs.trimToSize();
	}	
}