package view.article;

import javax.swing.table.AbstractTableModel;

import model.article.Article;
import model.gammeOperatoire.GammeOperatoire;
import controller.BaseDonnees;
import controller.GestionArticle;

/**
 * Classe qui definie le model de la JTable tableau
 * @see IHM#tableau
 * @author Magic Penguins
 *
 */
public class ModelStatiqueArticle extends AbstractTableModel {

	private static final long serialVersionUID = 7533497742126853386L;
	/**
	 * Liste des entetes du tableau
	 */
	private final String[] entetes = {"Code", "Designation", "Delai", "Stock", "Gamme de fabrication"};

	/**
	 * Constructeur du modele
	 */
	public ModelStatiqueArticle() {
		super();
	}


	/**
	 * Retourne le nombre de ligne du tableau
	 */
	@Override
	public int getRowCount() {
		if(BaseDonnees.listeArticles.isEmpty()) return 0;
		else return BaseDonnees.listeArticles.size();
	}

	/**
	 * Retourne le nombre de colonnes du tableau
	 */
	@Override
	public int getColumnCount() {
		return entetes.length;
	}

	/**
	 * Retourne le nom de la colonne numero clomnIndex
	 */
	@Override
	public String getColumnName(int columnIndex) {
		return entetes[columnIndex];
	}

	/**
	 * Retourne la classe de la colonne column
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Class getColumnClass(int column) {
		if ((column == 2) || (column == 3)) return Integer.class;
		else if (column == 4) return GammeOperatoire.class;
		else return String.class;
	}

	/**
	 * Retourne la valeur de la case voulue
	 */
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {

		switch(columnIndex){
		case 0:
			return BaseDonnees.listeArticles.get(rowIndex).getReference();
		case 1:
			return BaseDonnees.listeArticles.get(rowIndex).getDesignation();
		case 2:
			return BaseDonnees.listeArticles.get(rowIndex).getDelai();
		case 3:
			return BaseDonnees.listeArticles.get(rowIndex).getStock();
		case 4:
			return BaseDonnees.listeArticles.get(rowIndex).getGamme();
		default:
			return null; //Ne devrait jamais arriver
		}

	}

	/**
	 * Permet de generer le nom d'un article
	 * @param i 
	 * @return Le nom genere
	 */
	public String generateName(int i) {
		String str = "Article ";
		if (BaseDonnees.cptArticles +i <10) str+="0";
		return str+(BaseDonnees.cptArticles+i);
	}

	/**
	 * Permet d'ajouter un article au tableau et a la liste d'article
	 * @param delai
	 * Delai de l'article a ajouter
	 * @param stock
	 * stock de l'article a ajouter
	 */
	public void addArticle(int delai, int stock) {
		int i=0;
		while(!GestionArticle.creerArticle(generateName(i), delai, stock)) i++;		
		fireTableRowsInserted(BaseDonnees.listeArticles.size() -1, BaseDonnees.listeArticles.size() -1);
	}

	/**
	 * Supprime l'article de la ligne selectionne dans la base de donnees et dans le tableau
	 * @param rowIndex
	 */
	public void removeArticle(int rowIndex) {
		GestionArticle.supprimerArticle(rowIndex);
		fireTableRowsDeleted(rowIndex,rowIndex);
	}

	/**
	 * supprime toutes les valeurs du tableau
	 */
	public void supprimerTableau(){
		while(this.getRowCount()!=0){
			removeArticle(0);
		}
		BaseDonnees.listeArticles.clear();
	}

	/**
	 * Construit le tableau correspondant a la liste d'articles
	 */
	public void reconstruireTableau(){
		int i=0;
		while(i<BaseDonnees.listeArticles.size()){

			try {
				fireTableRowsInserted(i, i);
				i++;
			} catch (Exception e) {
				i++;
			}
		}
	}

	/**
	 * Defini si les cellules du tableau sont editables ou non
	 */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		if(columnIndex==0) return false;
		else return true; 
	}


	/**
	 * Defini la valeur de la cellule voulue du tableau
	 */
	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		if(aValue != null){
			Article article = BaseDonnees.listeArticles.get(rowIndex);

			switch(columnIndex){

			case 1:
				article.setDesignation((String)aValue);
				break;
			case 2:
				article.setDelai((Integer)aValue);
				break;
			case 3:
				article.setStock((Integer)aValue);
				break;
			case 4:
				article.setGamme((GammeOperatoire)aValue);
				break;
			}
		}
	}
}
