/*
 * Acteur.java, 9 sept. 2005
 * 
 * This file is part of FilmZ.
 *
 * Copyright © 2005 Johan Cwiklinski
 *
 * File :               Acteur.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;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import be.xtnd.gui.FilmzMain;

/**
 * Gère les acteurs
 *
 * @author Johan Cwiklinski
 * @version 1.1
 */
public class Acteur extends JoinClass {
	/** Nom de la table */
	public static String TABLE = "acteurs";
	/** Nom de la table des acteurs restreints */
	public static String RTABLE = "r_acteurs";
	/** Nom du champ de clé primaire */
	public static String PK = "id_acteur";
	/** Nom du champ de valeur */
	public static String VALUE = "acteur";
	/** Requête de liste des éléments */
	public static String LIST_QUERY = "SELECT * FROM "+TABLE+" ORDER BY "+VALUE+" ASC";
	/** Requête de liste des éléments restreints */
	public static String RLIST_QUERY = "SELECT * FROM "+RTABLE+" ORDER BY "+VALUE+" ASC";	

	/**
	 * Constructeur par défaut
	 */
	public Acteur(){
		super(
				Logger.getLogger(Acteur.class.getName()), //logger
				FilmzMain.collection.isPrive()?RTABLE:TABLE, //table
				FilmzMain.collection.getTable()+"acteurs",
				PK, //clé primaire 
				VALUE //nom champ
				);
	}
	
	/**
	 * Initialise un acteur en fonction de son id
	 * @param id id de l'acteur à initialiser
	 */
	public Acteur(Integer id) {
		this();
		this.loadFromId(id);
	}
	
	/**
	 * Initialise un acteur en fonction de son nom
	 * @param nom nom de l'acteur à initialiser
	 */
	public Acteur(String nom) {
		this();
		this.loadFromValue(nom);
	}
	
	/**
	 * Tableau d'acteurs par film
	 * 
	 * @param film : l'identifiant du film
	 * @return Renvoie liste d'acteurs
	 */
	public static ArrayList<Acteur> acteursFilm(Integer film){
		logger = Logger.getLogger(Acteur.class.getName());
		table = FilmzMain.collection.isPrive()?RTABLE:TABLE;
		pk = PK;
		value = VALUE;
		junction_table = FilmzMain.collection.getTable()+"acteurs";// JUNCTION_TABLE;
		ArrayList<Acteur> array = new ArrayList<Acteur>(5);
		ArrayList<Integer> refs = jonctionFilm(film);
		for(int i = 0 ; i < refs.size() ; i++){
			array.add(new Acteur(refs.get(i)));
		}
		array.trimToSize();
		return array;
	}
	
	/**
	 * Enregistre le tableau d'acteurs associé au film dans la base
	 * @param f
	 * @return int
	 */
	public int enregistrerActeurs(Film f){
		return enregistrerRefs(
				f.getId(),
				FilmzMain.collection.getTable()+"acteurs",
				f.getDeletedActors(),
				f.getActeurs()
				);
	}
		
	/**
	 * @return nombre d'acteurs dans la base
	 */
	public Integer getCount(){
		int count = -1;
		try{
			String table = FilmzMain.collection.isPrive()?RTABLE:TABLE;
			String query = "SELECT count("+PK+") as compte FROM "+table;
			ResultSet rs = database.execQuery(query);
			rs.first();
			count = rs.getInt("compte");
		}catch(SQLException e){
			logger.fatal("SQLException counting actors : "+e.getMessage()+" (code "+e.getErrorCode()+")");
			sqlMessage = "Message was : "+e.getMessage();
			sqlError = e.getErrorCode();
		}
		return count;
	}
	
	/**
	 * @return Renvoie acteur.
	 */
	public String getActeur() {
		return this.getValeur();
	}
	/**
	 * @param acteur acteur à définir.
	 */
	public void setActeur(String acteur) {
		this.setValeur(acteur);
	}
}
