using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DemoVideo.Nbanque;
using DemoVideo.Nutil;

namespace DemoVideo.Ndal
{
    public class CompteDao : ICompteDao
    {
        public List<Compte>ListeComptes { get;  }

        public CompteDao ()
        {
            ListeComptes = Util.GetComptes(); 
        }

        public CompteDao( List<Compte>listeComptes)
        {
            ListeComptes = listeComptes; 
        }

        public Compte GetCompte(string numero)
        {
            return ListeComptes.Where(cpt => cpt.Numero.Equals(numero))
                     .FirstOrDefault(); 
        }

        public (string, float) GetNumeroAndSolde(string numero)
        {
            var res = ListeComptes
                      .Where(cpt => cpt.Numero.Equals(numero))
                      .Select(cpt => new { cpt.Numero, cpt.Solde })
                      .FirstOrDefault();
            return (res.Numero , res.Solde) ; 
        }

        public Tuple<string, float> GetNumeroAndSoldeTuple(string numero)
        {
            Tuple<string, float> res = ListeComptes
                      .Where(cpt => cpt.Numero.Equals(numero))
                      .Select(cpt => new Tuple<string,float> (cpt.Numero, cpt.Solde ))
                      .FirstOrDefault();
            return (res);
        }

        public string GetInformationCompte()
        {
            StringBuilder res = new StringBuilder();
            res.AppendLine("Information sur les comptes :");
            res.AppendLine("Nombre de comptes :" + ListeComptes.Count());
            res.AppendLine("Total des soldes : " + ListeComptes.Sum(cpt => cpt.Solde));
            res.AppendLine("Moyenne des soldes : " + ListeComptes.Average(cpt => cpt.Solde));
            res.AppendLine("Solde minimum : " + ListeComptes.Min(cpt => cpt.Solde));
            res.AppendLine("Solde maximum : " + ListeComptes.Max(cpt => cpt.Solde));
            return res.ToString();


        }

        public bool AjouterCompte(Compte cpt)
        {
            throw new NotImplementedException();
        }

        public bool SupprimerCompte(string numero)
        {
            throw new NotImplementedException();
        }

        public void ModifierCompte(Compte cpt)
        {
            throw new NotImplementedException();
        }

        public void ModifierCompte(Compte cpt, float montant)
        {
            throw new NotImplementedException();
        }

        public Compte GetCompteDirectSql(string numero)
        {
            throw new NotImplementedException();
        }
    }
}
