using AppliWebANA.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AppliWebANA.Repositories.Messagerie {
	public abstract class MessagerieRepositoryBase : IDisposable {
		private static System.Reflection.ConstructorInfo Constructeur = null;
		public static MessagerieRepositoryBase Instancier() {
			if( Constructeur == null ) {
				string nomClasseMessagerieRepository = System.Configuration.ConfigurationManager
					.AppSettings["MessagerieRepository"];
				Constructeur = AppDomain
					.CurrentDomain // Dans le domaine,
					.GetAssemblies() // Y a des bibliothèques
					.Where( a => !a.IsDynamic ) // Je veux pas les assemblies dynamiques
					.SelectMany( a => a.ExportedTypes ) // Je fais une liste des listes de type de toutes les bibliothèques
					.Where( type => type.Name == nomClasseMessagerieRepository ) // Le type que je veux
					.First() // Y en aura qu'un
					.GetConstructor( new Type[0] ); // Je veux son ctor sans argument
			}
			return (MessagerieRepositoryBase) Constructeur.Invoke( new object[0] );
		}

		private bool CEstFait = false;
		public virtual void Dispose( bool memeLesTrucsPasDotNet ) {
			CEstFait = true;
		}

		public void Dispose() {
			if( !CEstFait ) {
				this.Dispose( true );
				GC.SuppressFinalize( this );
			}
		}

		public abstract IList<string> ListerUtilisateurs();
		/// <summary>
		/// Ajoute l'utilisateur si pas déjà présent
		/// </summary>
		/// <param name="nomUtilisateur"></param>
		/// <returns>Les messages de l'utilisateur (éventuellement vide si nouvel utilisateur)</returns>
		public abstract IList<Message> AjouterUtilisateur( string nomUtilisateur );
		public abstract IList<Message> ListerMessages( string nomUtilisateur );
		public abstract void Envoyer( string destinataire, Message message );

	}
}