using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models;

namespace WebApplication1.Controllers {
	public class ExerciceAnnuaireController : Controller {

		const int TaillePageParDefaut = 5;

		int TaillePage {
			get {
				return (int)(this.Session["TaillePage"] ?? (object)TaillePageParDefaut);
			}
			set {
				Session["TaillePage"] = value;
			}
		}
		// TODO : Finir l'exercice Annuaire
		public ActionResult Index( string btRechercher, Personne filtre, string tri, int? page, Guid? idEnEdition ) {
			ViewBag.Titres = AnnuaireEntities.TitresEnCache.Values;
			ViewBag.TaillePage = TaillePage;
			ViewBag.IdEnEdition = idEnEdition ?? Guid.Empty;
			if( btRechercher == null && tri == null && !page.HasValue && idEnEdition == null ) { // Pas de clic sur le btRechercher, pas de tri, c'est une navigation sur la page, pas d'erreur
				return View();
			}
			page = page ?? 0;
			filtre.Nom = (filtre.Nom ?? string.Empty).Trim(); // Les filtres ont été envoyés, mais pas tous vides, j'espère
			filtre.Prenom = (filtre.Prenom ?? string.Empty).Trim();
			filtre.Telephone = (filtre.Telephone ?? string.Empty).Trim();
			const string yarien = "0///";
			string recherche = $"{filtre.TitreId}/{filtre.Nom}/{filtre.Prenom}/{filtre.Telephone}";
			if( recherche == yarien ) {
				ModelState.AddModelError( string.Empty, "Filtrez un mimimum, quand même !" );
				return View();
			}
			List<Personne> resultats = (List<Personne>)HttpContext.Cache[recherche];
			if( resultats == null ) {
				using( var dc = new AnnuaireEntities() ) {
					IQueryable<Personne> rq = dc.Personnes.Include( "Titre" ).AsNoTracking();
					if( filtre.TitreId != 0 )
						rq = rq.Where( p => p.TitreId == filtre.TitreId );
					if( !string.IsNullOrWhiteSpace( filtre.Prenom ) )
						rq = rq.Where( p => p.Prenom.Contains( filtre.Prenom ) );
					if( !string.IsNullOrWhiteSpace( filtre.Nom ) )
						rq = rq.Where( p => p.Nom.Contains( filtre.Nom ) );
					if( !string.IsNullOrWhiteSpace( filtre.Telephone ) )
						rq = rq.Where( p => p.Telephone.Contains( filtre.Telephone ) );
					resultats = rq.ToList();
					HttpContext.Cache.Add( recherche, resultats, null, DateTime.Now.AddSeconds( 30 ), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null );
				}
			}
			else {
				ViewBag.Message = "Les données étaient présentes en cache !";
			}

			IEnumerable<Personne> resultatsRetraités;
			switch( tri ) {
				case "civilite_asc":
					resultatsRetraités = resultats.OrderBy( p => p.TitreId ).ThenBy( p => p.Id ); // ThenBy pour avoir un ordre total
					break;
				case "civilite_desc":
					resultatsRetraités = resultats.OrderByDescending( p => p.TitreId ).ThenBy( p => p.Id );
					break;
				case "nom_desc":
					resultatsRetraités = resultats.OrderByDescending( p => p.Nom ).ThenBy( p => p.Id );
					break;
				default:
					tri = "nom_asc";
					resultatsRetraités = resultats.OrderBy( p => p.Nom ).ThenBy( p => p.Id );
					break;
			}
			resultatsRetraités = resultatsRetraités.Skip( TaillePage * page.Value ).Take( TaillePage );

			ViewBag.Resultats = resultatsRetraités.ToList();
			ViewBag.Tri = tri;
			ViewBag.Page = page;
			ViewBag.NbPersonnes = resultats.Count;
			return View( filtre );
		}

		public ActionResult Valider( Personne filtre, string tri, int? page, Guid idEnEdition, string nvTelephone ) {
			using( var dc = new AnnuaireEntities() ) {
				var p = dc.Personnes.Find( idEnEdition );
				p.Telephone = nvTelephone;
				dc.SaveChanges();
				string recherche = $"{filtre.TitreId}/{filtre.Nom}/{filtre.Prenom}/{filtre.Telephone}";
				HttpContext.Cache.Remove( recherche );
				return RedirectToAction( "Index", new { filtre.Nom, filtre.Prenom, filtre.Telephone, filtre.TitreId, tri, page } );
			}
		}

		public ActionResult Preferences( int? taillePage ) {
			if( taillePage.HasValue ) {
				TaillePage = taillePage.Value;
				return RedirectToAction( "Index" );
			}
			return View( TaillePage );
		}
	}
}