/*
 * Cinefil.java, 4 févr. 2006
 * 
 * This file is part of FilmZ.
 *
 * Copyright © 2006 Johan Cwiklinski
 *
 * File :               Cinefil.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 cinefil.com
 * 
 * @author Johan Cwiklinski
 */
public class Cinefil extends RecupWeb{
    
	/**
	 * Cherche le titre en paramètre
	 * sur cinefil.com
	 * 
	 * @param title titre à chercher
	 */
	public Cinefil(String title){
		super(
				title, 
				"http://www.cinefil.com/cinefil2005/CFM_Recherches/films.cfm?lachaine2=[word]",
				"<nobr><font[^>]*+><b>&nbsp;Résultat&nbsp;([0-9]{1,3}).*?</nobr>",
				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[^>]*+>></a>";
		pattern = Pattern.compile(REGEX);
    	matcher = pattern.matcher(data);
    	while(matcher.find()){	
    		System.out.println(matcher.groupCount()+matcher.group(1));
    		System.out.println("new page found, parsing...");
    		data = loadUrl("http://www.cinefil.com"+matcher.group().substring(
    				matcher.group().indexOf("href=\"")+6,
    				matcher.group().lastIndexOf("\"")));
    		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){
    	System.err.println("film : "+movieName+", résultats : "+results+", url="+formattedUrl);
		REGEX = "<tr><td[^>]*+><font[^>]*+>\\[([0-9]{4}|xxxx)\\].*?<a.*?href='../(fichefilm.cfm\\?ref=[0-9]{1,5})[^>]*+>(.*?)</a>&nbsp;(.*?)</td></tr>";
        pattern = Pattern.compile(REGEX, Pattern.CASE_INSENSITIVE);
        matcher = pattern.matcher(data);
        while(matcher.find()) {
    		listeReponses[current] = new Object[2];
    		listeReponses[current][1] = matcher.group(3).replaceAll(rmMarks, "")+" ("+
    			matcher.group(4).replaceAll(rmMarks, "")+") - "+matcher.group(1);
			listeReponses[current][0] = matcher.group(2);			        			
            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.cinefil.com/cinefil2005/"+url);
		//StringBuffer data = loadUrl("http://www.allocine.fr"+url);
		//titre
		REGEX = "<title>(.*?)</title>";
		pattern = Pattern.compile(REGEX, Pattern.CASE_INSENSITIVE);
		matcher = pattern.matcher(data);
		while(matcher.find())
			titre = matcher.group(1);
		
		//titre original
		REGEX ="Titre original :(.*)";
		//REGEX ="<h4>Titre original : (.*?)</h4>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			titreOriginal = matcher.group(1).replaceAll(rmMarks,"").trim();
		
		//réalisateur && genre
		REGEX ="Une?(.*?)de |d'<a[^>]*+>(.*?)</a>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			genres.add(matcher.group(1));
			realisateurs.add(matcher.group(2).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>";
		REGEX = "avec.*";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			loadActors(matcher.group());
		
		//origines
		REGEX = "<img src='(.*?)'[^>]+>&nbsp;(.*?)&nbsp;";
		pattern = Pattern.compile(REGEX, Pattern.CASE_INSENSITIVE);
		matcher = pattern.matcher(data);
		while(matcher.find()){
			origines.add(matcher.group(1).replaceAll(rmMarks,"").trim());
			/*String[] origs = matcher.group(1).split("\\,");
			for(int z = 0 ; z < origs.length ; z++)
				origines.add(origs[z].trim());*/
		}
		
		//genre
		/*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 = "([0-9])h.([0-9]{1,2})";
		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 = "-&nbsp;([0-9]{4})&nbsp;";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			anneeProduction = new Integer(matcher.group(1));
		
		//année de sortie
		REGEX = "Sortie en salle le.*?([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 = "<font class=smallnoir><BR><font class=noir>[\\s]*<font class=noir12>(.*?)<BR>[\\s]*<BR CLEAR=\"all\">";
		//REGEX = "<h3><b>Synopsis</b></h3>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			synopsis = matcher.group(1);
		
		/*//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, "");
		}*/
		
		/*System.out.println(titre+" | "+titreOriginal+" | "+realisateurs+" | "+origines+" | "+genres+" | "+
				duree+" | "+anneeProduction+" | "+anneeSortie+" | "+synopsis+" | "+acteurs);*/
	} 
	
	/**
	 * Charge la page de casting du film,
	 * récupère et stocke les acteurs dans un 
	 * ArrayList
	 *  
	 * @param data données du casting
	 */
	protected void loadActors(String data){
		REGEX = "<a[^>]*+>(.*?)</a>";
		pattern = Pattern.compile(REGEX);
		matcher = pattern.matcher(data);
		while(matcher.find())
			acteurs.add(matcher.group(1).replaceAll(rmMarks, "").trim());
			
		acteurs.trimToSize();
		/*for(int i = 0 ; i < acteurs.size() ; i++){
			System.out.println(acteurs.get(i));
		}*/
	}	
}
