using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace GameAtlas.Models
{
    public class Manager : INotifyPropertyChanged
    {
        
        public List<Admin> Admins { get; private set; }
        public List<Utilisateur> Utilisateurs { get; private set; }

        private ObservableCollection<Jeu> topRatedGames;
        public ObservableCollection<Jeu> TopRatedGames
        {
            get
            {
                return topRatedGames = new ObservableCollection<Jeu>(ListJeux.OrderByDescending(jeu => jeu.Note).Take(4));
            }
            set
            {
                topRatedGames = value;
                OnPropertyChanged();
            }
        }

        private ObservableCollection<Jeu> listJeuxAffiches;
        public ObservableCollection<Jeu> ListJeuxAffiches
        {
            get
            {
                var cinqPremiersJeux = ListJeux.Take(5);
                return listJeuxAffiches = new ObservableCollection<Jeu>(cinqPremiersJeux);
            }
            set
            {
                listJeuxAffiches = value;
                OnPropertyChanged();
            }
        }

        private ObservableCollection<Jeu> listJeux;
        public ObservableCollection<Jeu> ListJeux
        { 
            get
            {
                return listJeux;
            }
            set
            {
                listJeux = value;
                OnPropertyChanged();
            }
        }

        public IPersistanceManager Persistance { get; set; }

        private Utilisateur connectedUser;
        public Utilisateur ConnectedUser
        {
            get => connectedUser;
            set
            {
                connectedUser = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler? PropertyChanged;

        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        public Manager(IPersistanceManager persistance)
        {
            Utilisateurs = new List<Utilisateur>();
            Admins = new List<Admin>();
            ListJeux = new ObservableCollection<Jeu>();
            Persistance = persistance;
            ConnectedUser = null;
        }

        public Manager() {
            ListJeux = new ObservableCollection<Jeu>();
            Admins = new List<Admin>();
            Utilisateurs = new List<Utilisateur>();
            ConnectedUser = null;
        }

        public void AddJeux(Jeu jeux)
        {
            ListJeux.Add(jeux);
        }

        public void AddAdmin(Admin admin)
        {
            Admins.Add(admin);
        }

        public void AddUtilisateur(Utilisateur utilisateur)
        {
            Utilisateurs.Add(utilisateur);
        }

        public void ChargerDonnees()
        {
            var donnees = Persistance.ChargeDonnees();

            foreach (var user in donnees.Item3)
            {
                AddUtilisateur(user);
            }

            foreach (var admin in donnees.Item2)
            { 
                AddAdmin(admin); 
            }

            foreach (var jeu in donnees.Item1)
            {
                AddJeux(jeu);
            }
           
        }

        public void SauvegardeDonnees()
        {
            Persistance.SauvegardeDonnees(ListJeux, Admins, Utilisateurs);
        }

    }
}
