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

/**
 * @author Johan Cwiklinski
 * @version 1.1 
 */
public class Realisateur extends JoinClass{
	/** Nom de la table */
	public static String TABLE = "realisateurs";
	/** Nom de la table des réalisateurs restreints */
	public static String RTABLE = "r_realisateurs";
	/** Nom du champ de clé primaire */
	public static String PK = "id_realisateur";
	/** Nom du champ de valeur */
	public static String VALUE = "realisateur";
	/** 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";	
	/** Réalisateur inconnu */
	public static final Integer UNKNOWN = 1;

	/**
	 * Constructeur par défaut
	 */
	public Realisateur(){
		super(
				Logger.getLogger(Realisateur.class.getName()), //logger
				FilmzMain.collection.isPrive()?RTABLE:TABLE, //table
				FilmzMain.collection.getTable() + "realisateurs",
				PK, //clé primaire 
				VALUE //nom champ
				);
	}
	
	/**
	 * Initialise un réalisateur en fonction de son id
	 * @param id id du réalisateur à initialiser
	 */
	public Realisateur(Integer id) {
		this();
		this.loadFromId(id);
	}

	/**
	 * Initialise un réalisateur en fonction de son nom
	 * @param realisateur nom du réalisateur à initialiser
	 */
	public Realisateur(String realisateur) {
		this();
		this.loadFromValue(realisateur);
	}

	/**
	 * Tableau des réalisateurs par film
	 * 
	 * @param film : l'identifiant du film
	 * @return Renvoie liste des réalisateurs
	 */
	public static ArrayList<Realisateur> realisateursFilm(Integer film){
		logger = Logger.getLogger(Realisateur.class.getName());
		table = FilmzMain.collection.isPrive()?RTABLE:TABLE;
		pk = PK;
		value = VALUE;
		junction_table = FilmzMain.collection.getTable() + "realisateurs"; //JUNCTION_TABLE;
		ArrayList<Realisateur> array = new ArrayList<Realisateur>(5);
		ArrayList<Integer> refs = jonctionFilm(film);
		for(int i = 0 ; i < refs.size() ; i++){
			array.add(new Realisateur(refs.get(i)));
		}
		array.trimToSize();
		return array;
	}

	/**
	 * Enregistre le tableau de réalisateurs associé au film dans la base
	 * @param f
	 * @return int
	 */
	public int enregistrerRealisateurs(Film f){
		return enregistrerRefs(
				f.getId(),
				FilmzMain.collection.getTable() + "realisateurs",
				f.getDeletedDirectors(),
				f.getRealisateurs()
				);
	}
	
	/**
	 * @return nombre de réalisateurs 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 directors : "+e.getMessage()+" (code "+e.getErrorCode()+")");
			sqlMessage = "Message was : "+e.getMessage();
			sqlError = e.getErrorCode();
		}
		return count;
	}

	/**
	 * @return Renvoie réalisateur.
	 */
	public String getRealisateur() {
		return this.getValeur();
	}
	
	/**
	 * @param realisateur réalisateur à définir.
	 */
	public void setRealisateur(String realisateur) {
		this.setValeur(realisateur);
	}	
}
