using AppliWebANA.Models;
using DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Mvc;

namespace AppliWebANA.Controllers {
	[Authorize]
	public class AnnuaireController : Controller {

		private AnnuaireEntities _DC = null;
		private AnnuaireEntities DC {
			get {
				if( _DC == null ) {
					_DC = new AnnuaireEntities();
					_DC.Configuration.LazyLoadingEnabled = false;
				}
				return _DC;
			}
		}


		public ActionResult Index() {
			ViewBag.Titres = Utilitaires.Titres;
			return View();
		}

		public ActionResult Rechercher( Personne filtre, short? titreId ) {
			string clé = Request.Url.Query.Replace( " ", string.Empty ).ToUpper();
			var resultats = (IEnumerable<Personne>)HttpContext.Cache[clé];
			if( resultats == null ) {
				IQueryable<Personne> requete = DC.Personnes.AsNoTracking();
				if( titreId.HasValue )
					requete = requete.Where( p => p.TitreId == titreId.Value );
				if( !string.IsNullOrWhiteSpace( filtre.Nom ) ) {
					filtre.Nom = filtre.Nom.Trim();
					requete = requete.Where( p => p.Nom.Contains( filtre.Nom ) );
				}
				if( !string.IsNullOrWhiteSpace( filtre.Prenom ) ) {
					filtre.Prenom = filtre.Prenom.Trim();
					requete = requete.Where( p => p.Prenom.Contains( filtre.Prenom ) );
				}
				if( !string.IsNullOrWhiteSpace( filtre.Telephone ) ) {
					filtre.Telephone = filtre.Telephone.Trim();
					requete = requete.Where( p => p.Telephone.Contains( filtre.Telephone ) );
				}
				resultats = requete.ToList();
				HttpContext.Cache.Add( clé, resultats, null, DateTime.Now.AddMinutes( 10 ), Cache.NoSlidingExpiration, CacheItemPriority.Default, null );
				ViewBag.Message = "Requête exécutée";
			}
			else
				ViewBag.Message = "Données en cache";

			ViewBag.personnes = resultats;
			ViewBag.Titres = Utilitaires.Titres;
			return View( "Index" );
		}

		public PartialViewResult Edition( Guid id ) {
			if( Request.Form.AllKeys.Contains( "Edit" ) ) { // Bt pour passer une ligne en mode édition
				var personne = DC.Personnes.First( p => p.Id == id );
				ViewBag.Titres = Utilitaires.Titres.Values;
				return PartialView( "LigneEnEdition", personne );
			}
			else if( Request.Form.AllKeys.Contains( "Cancel" ) ) {
				var personne = DC.Personnes.First( p => p.Id == id );
				ViewBag.Titres = Utilitaires.Titres;
				return PartialView( "LigneEnLecture", personne );
			}
			else if( Request.Form.AllKeys.Contains( "Update" ) ) {
				Personne maj = new Personne();
				if( TryUpdateModel( maj ) ) {
					DC.Entry( maj ).State = System.Data.Entity.EntityState.Modified;
					DC.SaveChanges();
					ViewBag.Titres = Utilitaires.Titres;
					return PartialView( "LigneEnLecture", maj );
				}
				else {
					ViewBag.Titres = Utilitaires.Titres.Values;
					return PartialView( "LigneEnEdition", maj );
				}
			}
			throw new ArgumentException( "Hein ? Kéchécha ?" );
		}


		protected override void Dispose( bool disposing ) {
			if( _DC != null ) {
				_DC.Dispose();
			}
			base.Dispose( disposing );
		}

	}
}