﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace anothervkflooder.Core.FileReaders
{
    /// <summary>
    /// Читалка тхт файлов.
    /// </summary>
    class TxtReader : IFileReader
    {
        private string path;
        private Dictionary<int, string> files;
        Random rand;

        /// <summary>
        /// Конструктор читалки.
        /// </summary>
        /// <param name="path">Путь к файлу.</param>
        public TxtReader(string path, int seed)
        {
            this.path = path;
            files = new Dictionary<int, string>();
            rand = new Random(seed);
        }

        /// <summary>
        /// Получает словарь с путями к файлам.
        /// </summary>
        public void GetFilesCollection()
        {
            if (File.Exists(path))
            {
                files.Add(files.Count + 1, path);
            }
            else if (Directory.Exists(path))
            {
                string[] getFiles = Directory.GetFiles(path, "*.txt");
                if (getFiles.Length == 0)
                {
                    throw new ArgumentException("В директории нет текстовых файлов");
                }
                foreach (var file in getFiles)
                {
                    files.Add(files.Count + 1, file);
                }
            }
            else
            {
                throw new ArgumentException("В директории нет файлов");
            }
        }

        /// <summary>
        /// Читает рандомный файл.
        /// </summary>
        /// <returns>Вовзращает строку с текстом из файла.</returns>
        public string GetFile()
        {
            return Read(files[rand.Next(1, files.Count + 1)]).Result;
        }

        /// <summary>
        /// Синхронно читает файл до конца.
        /// </summary>
        /// <param name="filePath">Путь к файлу.</param>
        /// <returns>Возвращает строку с текстом из файла.</returns>
        public async Task<string> Read(string filePath)
        {
            string data;
            using (var input = new StreamReader(filePath, true))
            {
                data = await input.ReadToEndAsync();
            }
            return data;
        }
    }
}
