/// <summary>
 /// Refresh books local collection.
 /// </summary>
 /// <param name="books">Books to be saved.</param>
 /// <returns>Books collection.</returns>
 public IList <Book> Refresh(AbstractBookStorage books)
 {
     try
     {
         booksRepository.Refresh(books);
         logger.Info("Books were refreshed.");
     }
     catch (Exception e)
     {
         logger.Error(e.Message);
         throw;
     }
 }
        static void Main(string[] args)
        {
            storage  = new BookListStorage();
            bookShop = new BookListService(storage);

            Console.WriteLine("Next commands are availiable:" + "\n");
            Console.WriteLine("1. Show all books");
            Console.WriteLine("2. Add a book");
            Console.WriteLine("3. Delete a book");
            Console.WriteLine("4. Find appropriate book");
            Console.WriteLine("5. Sort books" + "\n");

            while (alive)
            {
                try
                {
                    command = Console.ReadLine();
                    switch (command)
                    {
                    case "1": ShowAvailableBooks(bookShop); break;

                    case "2": AddBookToShop(bookShop); break;

                    case "3": DeleteBook(bookShop); break;

                    default: Console.WriteLine("Sorry, this command still in process.."); break;
                    }
                }
                catch (InvalidBookDataException e)
                {
                    Console.WriteLine(e.message);
                }
                catch (BookAlreadyExistsException e)
                {
                    Console.WriteLine(e.message);
                }
                catch (BookNotExistsException e)
                {
                    Console.WriteLine(e.message);
                }
            }
        }
        /// <summary>
        /// Find appropriate books through books collection.
        /// </summary>
        /// <param name="parameter">Criteria.</param>
        /// <param name="books">Collection.</param>
        /// <returns>Appropriate books collection.</returns>
        public IEnumerable <Book> FindBooks(IFinder <Book> predicate, AbstractBookStorage books)
        {
            IList <Book> allBooksInStorage = Refresh(books);
            List <Book>  findedBooks       = new List <Book>();

            logger.Info($"Searching books by {predicate} criteria.");

            foreach (var book in allBooksInStorage)
            {
                if (predicate.BookIsRight(book))
                {
                    findedBooks.Add(book);
                }
            }
            if (findedBooks.Count == 0)
            {
                logger.Error("We can not find book(s) with such criteria.");
            }
            return(findedBooks);
        }
 /// <summary>
 /// Constructor with a logger instance.
 /// </summary>
 /// <param name="storage">Storage wich contain all books data.</param>
 /// <param name="logger">Logger instance.</param>
 public BookListService(AbstractBookStorage storage, Logs logger)
 {
     booksRepository = storage;
     this.logger     = logger;
 }
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="storage">Storage wich contain all books data.</param>
 public BookListService(AbstractBookStorage storage)
 {
     booksRepository = storage;
     logger          = new Logs();
 }