using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;


using System.Text;

namespace covoiturage.modele
{
    public class Contexte
    {
        private const int NB_CAR_MDP = 4;

                                        /* lesChauffeurs */
        private static List<Chauffeur> _lesChauffeurs= new List<Chauffeur>()
        {
            new Chauffeur {id = "1",nom ="Azria", prenom = "Alain", mail="azria@gmail.com", tel="0645789565", mdp="aaaa", user="azriaA" },
            new Chauffeur {id = "2", nom = "Benamou", prenom = "Bernard", mail = "benamou@gmail.com", tel = "0632659878", mdp = "bbbb", user = "benamouB" },
            new Chauffeur {id = "3", nom = "Chartier", prenom = "Chamir", mail = "chartier@gmail.com", tel = "0698486145", mdp = "cccc", user = "chartierC" },
            new Chauffeur {id = "4", nom = "Diarrah", prenom = "Dominique", mail = "diarrah@gmail.com", tel = "0689872532", mdp = "dddd", user = "diarrahD" },
            new Chauffeur {id = "5", nom = "Ermine", prenom = "Elhi", mail = "ermine@gmail.com", tel = "0677786145", mdp = "eeee", user = "ermineE" }
        } ;
        public static List<Chauffeur> lesChauffeurs
        {
            get { return _lesChauffeurs; }
            set { _lesChauffeurs = value; }

        }

                                    /*lesOffresDepartEntreprise */

        private static List<OffreDepartEntreprise> _lesOffresDepartEntreprise = new List<OffreDepartEntreprise>()
        {
            new OffreDepartEntreprise {id = "1",chauffeur = getLeChauffeur("1"),jour="mardi",heure="15h",date="permanent",lieu = "paris 20" },
            new OffreDepartEntreprise { id = "2", chauffeur = getLeChauffeur("2"), jour = "mardi", heure = "16h", date = "15/02/2014", lieu = "Métro Robespierre" },
            new OffreDepartEntreprise { id = "3", chauffeur = getLeChauffeur("3"), jour = "mercredi", heure = "17h30", date = "26/02/2014", lieu = "Bobigny Mairie" },
            new OffreDepartEntreprise { id = "4", chauffeur = getLeChauffeur("1"), jour = "mercredi", heure = "17h", date = "permanent", lieu = "paris 20" },
            new OffreDepartEntreprise { id = "5", chauffeur = getLeChauffeur("2"), jour = "mardi", heure = "17h30", date = "28/02/2014", lieu = "Métro Robespierre" },
            new OffreDepartEntreprise { id = "6", chauffeur = getLeChauffeur("3"), jour = "vendredi", heure = "15h30", date = "permanent", lieu = "Bobigny Mairie" },
            new OffreDepartEntreprise { id = "7", chauffeur = getLeChauffeur("4"), jour = "lundi", heure = "16h", date = "permanent", lieu = "Métro république" },
            new OffreDepartEntreprise { id = "8", chauffeur = getLeChauffeur("5"), jour = "lundi", heure = "17h", date = "21/02/2014", lieu = "Métro Bastille" },
            new OffreDepartEntreprise { id = "9", chauffeur = getLeChauffeur("5"), jour = "mercredi", heure = "17h30", date = "28/02/2014", lieu = "Métro Bastille" },
            new OffreDepartEntreprise { id = "10", chauffeur = getLeChauffeur("1"), jour = "lundi", heure = "16h", date = "permanent", lieu = "paris 20" },
            new OffreDepartEntreprise { id = "11", chauffeur = getLeChauffeur("2"), jour = "mardi", heure = "17h30", date = "30/01/2014", lieu = "Métro Robespierre" },
            new OffreDepartEntreprise { id = "12", chauffeur = getLeChauffeur("4"), jour = "jeudi", heure = "17h30", date = "permanent", lieu = "Bobigny Mairie" },
        };
        public static List<OffreDepartEntreprise> lesOffresDepartEntreprise
        {
            get { return _lesOffresDepartEntreprise; }
            set { _lesOffresDepartEntreprise = value; }
        }
                                                             /*lesOffresDepartEntreprise */
        private static List<OffreDepartDomicile> _lesOffresDepartDomicile = new List<OffreDepartDomicile>()
        {
            new OffreDepartDomicile { id = "1", chauffeur = getLeChauffeur("1"), jour = "lundi", heure = "8h", date = "permanent", lieu = "paris 20", 
                                                    ramassages = new string[]{"Métro Gambetta", "Porte des Lilas"}},
            new OffreDepartDomicile { id = "2", chauffeur = getLeChauffeur("2"), jour = "mardi", heure = "7h", date = "15/02/2014", lieu = "Métro Robespierre",
                                                     ramassages = new string[]{"Métro Mairie de Montreuil", "Place de Villiers A3"}},
            new OffreDepartDomicile { id = "3", chauffeur = getLeChauffeur("3"), jour = "mercredi", heure = "7h30", date = "26/02/2014", lieu = "Bobigny Mairie", 
                                                      ramassages = new string[]{"Autoroute A3 Bobigny", "Autoroute A3 sortie Aulnay"}},
            new OffreDepartDomicile { id = "4", chauffeur = getLeChauffeur("1"), jour = "mercredi", heure = "9h", date = "permanent", lieu = "paris 20", 
                                                     ramassages = new string[]{"Métro Gambetta", "Porte des Lilas"}},
            new OffreDepartDomicile { id = "5", chauffeur = getLeChauffeur("2"), jour = "mardi", heure = "11h30", date = "28/02/2014", lieu = "Métro Robespierre", 
                                                    ramassages = new string[]{"Métro Mairie de Montreuil", "Place de Villiers A3"}},
            new OffreDepartDomicile { id = "6", chauffeur = getLeChauffeur("3"), jour = "vendredi", heure = "10h30", date = "permanent", lieu = "Bobigny Mairie",
                                                    ramassages = new string[] { "Autoroute A3 Bobigny", "Autoroute A3 sortie Aulnay" }},
            new OffreDepartDomicile { id = "7", chauffeur = getLeChauffeur("4"), jour = "lundi", heure = "8h", date = "permanent", lieu = "Métro république",
                                                    ramassages = new string[] { "Métro Belleville", "Porte des Lilas" }},
            new OffreDepartDomicile { id = "8", chauffeur = getLeChauffeur("5"), jour = "lundi", heure = "10h", date = "21/02/2014", lieu = "Métro Bastille",
                                                    ramassages = new string[] { "Métro Porte de Bercy" }},
            new OffreDepartDomicile { id = "9", chauffeur = getLeChauffeur("5"), jour = "mercredi", heure = "9h30", date = "28/02/2014", lieu = "Métro Bastille",
                                                    ramassages = new string[] { "Métro Porte de Bercy" }},
            new OffreDepartDomicile { id = "10", chauffeur = getLeChauffeur("1"), jour = "lundi", heure = "8h", date = "permanent", lieu = "paris 20",
                                                    ramassages = new string[] { "Métro Gambetta", "Porte des Lilas" }},
            new OffreDepartDomicile { id = "11", chauffeur = getLeChauffeur("2"), jour = "mardi", heure = "7h30", date = "30/01/2014", lieu = "Métro Robespierre",
                                                    ramassages = new string[] { "Métro Mairie de Montreuil", "Place de Villiers A3" } },
            new OffreDepartDomicile { id = "12", chauffeur = getLeChauffeur("4"), jour = "jeudi", heure = "8h30", date = "permanent", lieu = "Bobigny Mairie",
                                                    ramassages = new string[] { "Métro Belleville", "Porte des Lilas" }}
        };
        public static List<OffreDepartDomicile> lesOffresDepartDomicile
        {
            get { return _lesOffresDepartDomicile; }
            set { _lesOffresDepartDomicile = value; }
        }
        public static List<OffreDepartEntreprise> getMesOffresDepartEntreprise(string idChauffeur)
        {
            List<OffreDepartEntreprise> lesOffres = lesOffresDepartEntreprise;
            
            var req = (from o in lesOffres
                       where o.chauffeur.id == idChauffeur
                       select o).ToList();
            return req;
       }
        public static List<OffreDepartDomicile> getMesOffresDepartDomicile(string idChauffeur)
        {
            List<OffreDepartDomicile> lesOffres = lesOffresDepartDomicile;

            var req = (from o in lesOffres
                       where o.chauffeur.id == idChauffeur
                       select o).ToList();
            return req;
        }
        private static Chauffeur getLeChauffeur(string id)
        {
            Chauffeur c = null;
            var req = (from o in lesChauffeurs  
                       where o.id == id
                       select o).ToList();
            if (req.Count > 0)
                c = req.First();

            
            return c;
        }
        public static Chauffeur getLeChauffeur(string user, string mdp)
        {
            Chauffeur c = null;
            var req = (from o in lesChauffeurs  
                       where o.user == user && o.mdp == mdp
                       select o).ToList();
            if (req.Count > 0)
                c = req.First();
            return c;
        }
        
        public static List<OffreDepartEntreprise> getLesOffresDepartEntreprise(string jour)
        {
            List<OffreDepartEntreprise> lesOffres = Contexte.lesOffresDepartEntreprise;
            var req = (from o in lesOffres
                       where o.jour == jour
                       select o).ToList();

            return req;
        }
        
        public static List<OffreDepartDomicile> getLesOffresDepartDomicile(string jour)
        {
            List<OffreDepartDomicile> lesOffres = Contexte.lesOffresDepartDomicile;
            var req = (from o in lesOffres
                       where o.jour == jour
                       select o).ToList();

            return req;
        }
        public static void  ajouteChauffeur(Chauffeur chauffeur)
        {
            if (getLeChauffeur(chauffeur.user, chauffeur.mdp) == null)
            {
                chauffeur.id = lesChauffeurs.Count.ToString();
                lesChauffeurs.Add(chauffeur);
            }
        }
        private static string getMdp(int nb)
        {
            Random r = new Random();
            string mdp="";
            char[] lettres = new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','1','2','3','4','5','6'};
            for(int i=0; i<nb; i++)
                mdp+=lettres[ r.Next(0,lettres.Length-1)].ToString();
            return mdp;
        }
        public static string[] getLogin(string nom, string prenom)
        {
            string user = nom.ToLower() + prenom.ToUpper()[0].ToString();
            string mdp = getMdp(NB_CAR_MDP);
            return new string[]{user,mdp};
        }
        public static void supprimeroffre(OffreDepartDomicile o)
        {
            lesOffresDepartDomicile.Remove(o);
        }
        public static void supprimeroffre(OffreDepartEntreprise o)
        {
            lesOffresDepartEntreprise.Remove(o);
        }
        public static void ajouterOffreDepartEntreprise(Chauffeur chauffeur,string jour,string heure, string date, string lieu)
        {
            lesOffresDepartEntreprise.Add(new OffreDepartEntreprise { id = lesOffresDepartEntreprise.Count.ToString(), chauffeur = chauffeur, jour = jour, heure = heure, date = date, lieu = lieu });
        }
        public static void ajouterOffreDepartDomicile(Chauffeur chauffeur, string jour, string heure, string date, string lieu, string[] lesRamassages)
        {
            lesOffresDepartDomicile.Add(new OffreDepartDomicile { id = lesOffresDepartDomicile.Count.ToString(), chauffeur = chauffeur, jour = jour, heure = heure, date = date, lieu = lieu, ramassages= lesRamassages });
        }
       
    }


                                             /* classe Chauffeur*/
    public class Chauffeur 
    {
        private string _nom;
        private string _mail;
        private string _tel;
        public string id { get; set; }
        public string prenom { get; set; }
        public string nom 
        { 
            get 
            { 
                return _nom; 
            } 
            set
            {
                    if (!String.IsNullOrEmpty(value))
                        _nom = value;
                    else
                        throw new Exception("Le champ nom ne doit pas être vide !!");
            }
        }
        public string tel
        {
            get
            {
                return _tel;
            }
            set
            {
                
                    if (value.Length != 10 || String.IsNullOrEmpty(value))
                        throw new Exception("le numéro de téléphone doit contenir 10 chiffres !!");
                    _tel = value;
            }
        }
        public string mail
        {
            get 
            { 
                return _mail; 
            }
            set
            {
                System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");

                if (!r.IsMatch(value) || String.IsNullOrEmpty(value))
                {
                    throw new Exception("Adresse mail non valide !!");
                }
                else
                    _mail = value;
            }
        }
        public string user { get; set; }
        public string mdp { get; set; }
    }


                                                /* Classe OffreDepartEntreprise */
    public class OffreDepartEntreprise
    {
        public Chauffeur chauffeur { get; set; }
        public string id { get; set; }
        public string jour { get; set; }
        public string date { get; set; }
        public string heure { get; set; }
        public string lieu { get; set; }
        
    }

                                             /* Classe OffreDepartDomicile */
    public class OffreDepartDomicile
    {
        public Chauffeur chauffeur { get; set; }
        public string id { get; set; }
        public string jour { get; set; }
        public string date { get; set; }
        public string heure { get; set; }
        public string lieu { get; set; }
        public string[] ramassages { get; set; }
    }




}
