﻿using anothervkflooder.Core.Users;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace anothervkflooder.Core.FileReaders
{
    /// <summary>
    /// Читалка юзеров из json
    /// </summary>
    class UsersReader
    {
        private List<WipeUser> users;

        public UsersReader()
        {
            users = new List<WipeUser>();
        }

        /// <summary>
        /// Десериализация юзеров.
        /// </summary>
        public async Task DeserializeUsers(string path)
        {
            try
            {
                users = JsonConvert.DeserializeObject<List<WipeUser>>(await Read(path));
            }
            catch (JsonSerializationException e)
            {
                MessageBox.Show(String.Format("Ошибка десериализации.\n{0}", e.Message));
            }
            catch (JsonReaderException e)
            {
                MessageBox.Show(String.Format("Ошибка десериализации.\n{0}", e.Message));
            }
        }

        /// <summary>
        /// Сериализация юзеров.
        /// </summary>
        /// <param name="users">Коллекция с юзерами.</param>
        public async void SerializeUsers(string path, ObservableCollection<WipeUser> users)
        {
            try
            {
                string json = JsonConvert.SerializeObject(users);
                await Write(path, json);
            }
            catch (JsonSerializationException e)
            {
                MessageBox.Show(String.Format("Ошибка сериализации.\n{0}", e.Message));
            }
        }

        /// <summary>
        /// Вовзращает юзеров из коллекции.
        /// </summary>
        /// <returns>Юзер.</returns>
        public IEnumerable<WipeUser> GetUser()
        {
            if (users != null)
            {
                foreach (var i in users)
                {
                    yield return i;
                }
            }
            else
            {
                throw new ArgumentException("Пустой JSON");
            }
        }

        public async Task<string> Read(string path)
        {
            string data;
            using (var input = new StreamReader(path))
            {
                data = await input.ReadToEndAsync();
            }
            return data;
        }

        public async Task Write(string path, string data)
        {
            using (var output = new StreamWriter(path, false))
            {
                await output.WriteAsync(data);
            }
        }
    }
}
