package model;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Session {
	private int id;
	
	private Date dateDebut;
	private Date dateFin;
	private int repetition = 1;
	private Enseignant createur;
	private Promotion promotion;
	private Module module;
	private QCM qcm;
	
	public class InvalidDate extends Exception {
		private static final long serialVersionUID = 1L;
		private Date date;
		public InvalidDate(Date d) {
			super();
			this.date = d;
		}
		public Date getDate() {
			return this.date;
		}
	}
	/**
	 * Type désignant une session de QCM
	 * @param dateDebut Date de début de session
	 * @param dateFin Date de fin de session
	 * @param repetition Nombre maximum de tentatives à la session
	 * @param createur Enseignant créateur
	 * @param promotion Promotion d'élèves concernée
	 * @param module Module d'enseignement concerné
	 * @param qcm QCM employé
	 */
	public Session(Date dateDebut, Date dateFin, int repetition, Enseignant createur, Promotion promotion, Module module, QCM qcm) {
		this.dateDebut = dateDebut;
		this.dateFin = dateFin;
		this.repetition = repetition;
		this.createur = createur;
		this.promotion = promotion;
		this.module = module;
		this.qcm = qcm;
		this.id = this.hashCode();
	}
	/**
	 * Type désignant une session de QCM (Appelé à l'importation de la base de données)
	 * @param id ID
	 * @param dateDebut Date de début de session
	 * @param dateFin Date de fin de session
	 * @param repetition Nombre maximum de tentatives à la session
	 * @param createur Enseignant créateur
	 * @param promotion Promotion d'élèves concernée
	 * @param module Module d'enseignement concerné
	 * @param qcm QCM employé
	 */
	public Session(int id, Date dateDebut, Date dateFin, int repetition, Enseignant createur, Promotion promotion, Module module, QCM qcm) {
		this.dateDebut = dateDebut;
		this.dateFin = dateFin;
		this.repetition = repetition;
		this.createur = createur;
		this.promotion = promotion;
		this.module = module;
		this.qcm = qcm;
		if (id == 0) {
			this.id = this.hashCode();
		} else {
			this.id = id;
		}
	}
	/**
	 * Getter promotion
	 * @return Promotion affectée par la session
	 */
	public Promotion getPromotion() {
		return promotion;
	}
	/**
	 * Setter promotion
	 * @param promotion Promotion affectée par la session
	 */
	public void setPromotion(Promotion promotion) {
		this.promotion = promotion;
	}
	/**
	 * Getter QCM
	 * @return QCM utlisé par la session
	 */
	public QCM getQcm() {
		return qcm;
	}
	/**
	 * Setter QCM
	 * @param qcm QCM utilisé par la session
	 */
	public void setQcm(QCM qcm) {
		this.qcm = qcm;
	}
	/**
	 * Getter module
	 * @return Module auquel se rapporte la session
	 */
	public Module getModule() {
		return module;
	}
	/**
	 * Setter module
	 * @param module Module auquel se rapporte la session
	 */
	public void setModule(Module module) {
		this.module = module;
	}
	/**
	 * Getter date de début
	 * @return Date de début de la session
	 */
	public Date getDateDebut() {
		return dateDebut;
	}
	/**
	 * Setter date de début
	 * @param dateDebut Date de début de la session
	 */
	public void setDateDebut(Date dateDebut) {
		this.dateDebut = dateDebut;
	}
	/**
	 * Getter date de fin
	 * @return Date de fin de la session
	 */
	public Date getDateFin() {
		return dateFin;
	}
	/**
	 * Setter date de fin
	 * @param dateFin Date de fin de la session
	 */
	public void setDateFin(Date dateFin) throws InvalidDate {
		Date now = new Date();
		if (dateFin.before(now)) {
			throw new InvalidDate(now);
		}
		if (dateFin.before(this.dateDebut)) {
			throw new InvalidDate(this.dateDebut);
		}
		this.dateFin = dateFin;
	}
	/**
	 * Getter répétition
	 * @return Nombre maximum de répétitions d'une session
	 */
	public int getRepetition() {
		return repetition;
	}
	/**
	 * Setter répétition
	 * @param repetition Nombre maximum de répétitions d'une session
	 */
	public void setRepetition(int repetition) {
		this.repetition = repetition;
	}
	/**
	 * Getter créateur
	 * @return Enseignant créateur de la session
	 */
	public Enseignant getCreateur() {
		return createur;
	}
	/**
	 * Setter créateur
	 * @param createur Enseignant créateur de la session
	 */
	public void setCreateur(Enseignant createur) {
		this.createur = createur;
	}
	
	public int getId() {
		return this.id;
	}
	
	public boolean isEnCours() {
		Date now = new Date();
		return (this.dateDebut.before(now)) && (this.dateFin.after(now));
	}
	
	public String toString() {
		DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
		String str = "QCM '" + this.qcm.getLibelle() + "'";
		str += " ('" + this.module.getLibelle() + "'";
		str += " pour " + this.promotion.getLibelle() + ")";
		str += " du " + dateFormat.format(this.dateDebut);
		str += " au " + dateFormat.format(this.dateFin);
		return str;
	}
}
