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

namespace Messagerie.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
					.GetAssemblies()
					.Where(x => !x.IsDynamic)
					.SelectMany(x => x.ExportedTypes)
					.Where(type => type.Name == nomClasseMessagerieRepository)
					.First()
					.GetConstructor(new Type[0]);
			}
			return (MessagerieRepositoryBase)(Constructeur.Invoke(new object[0]));
		}

		private bool CestFait = false;

		public virtual void Dispose(bool memelestrucspasdortnet) {
			CestFait = true;
		}

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

		public abstract IEnumerable<string> ListerUtilisateurs();
		public abstract IList<Message> AjouterUtilisateur(string nomUtilisateur);
		public abstract IList<Message> ListerMessages(string nomUtilisateur);
		public abstract void Envoyer(string destinqtaire, Message message);
	}
}