Program.cs
    
    
    
    
    
        Home
            /
src                    /
Test                    /
Calibre                    /
                    Program.cs
    
    
            
            using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using System.IO;
using System.Diagnostics;
using Microsoft.EntityFrameworkCore;
using Tools.PdfProvider;
using LibraryText;
using LibraryText.Entities;
using Calibre.Model.Database;
using Calibre.Model.Database.Entities;
using Calibre.Model.Domain.Entities;
using Calibre.Model.Domain.Dal;
namespace Calibre
{
    class Program
    {
        static async Task Main(string[] args)
        {
            //var connectionString = @"";
            //using (var context = new CalibreContext(connectionString))
            //{
            //    var books = context.Books
            //        .OrderBy(e => e.Id)
            //       .ToArray();
            //}
            //await SearchByTitleInDirectory(
            //    new DirectoryInfo(@"S:\BooksText\Calibre"),
            //    "iot"
            //    );
            //await SearchInPdfText(
            //    new DirectoryInfo(@"S:\BooksText\Calibre"),
            //    "NumPy"
            //    );
            await LoadToDb(
                new DirectoryInfo(@"S:\BooksText\Calibre")
                );
        }
        static async Task<BookWithLibraryContainer[]> SearchByTitleInDirectory(
            DirectoryInfo directory,
            string containsTitle,
            bool printLine = true
            )
        {
            var watch = Stopwatch.StartNew();
            var searchProvider = new SearchProvider(
                new SimplePdfReader()
                );
            var libraries = Library.SearchAll(directory);
            var searchResult = await searchProvider.GetBooksByLibrariesAsync(
                libraries: libraries
                )
                .ConfigureAwait(false);
            watch.Stop();
            var allBooks = searchResult
                .SelectMany(e => e.Value)
                .ToArray();
            var allTags = allBooks
                .SelectMany(e => e.Book.Tags)
                .Select(e => e.TagItem)
                .Distinct()
                .ToHashSet();
            var result = allBooks;
            if (!string.IsNullOrEmpty(containsTitle))
            {
                result = allBooks
                .Where(
                    e =>
                        //Заголовок
                        e.Book.Title.Contains(containsTitle, StringComparison.OrdinalIgnoreCase)
                        //Теги
                        || e.Book.Tags.Any(
                                e => e.TagItem.Name.Contains(containsTitle, StringComparison.OrdinalIgnoreCase)
                                )
                    )
                .ToArray();
            }
            if (printLine)
            {
                foreach (var elem in result)
                {
                    Console.WriteLine($"{elem.Library.Data.Name}|{elem.Book.Title}|{elem.Book.AuthorSort}");
                }
            }
            var a = allBooks
                .Where(
                    e => e.Book.Autors
                        .Any(
                            e2 => e2.AuthorItem.Name.Contains("Тарик")
                            )
                    )
                .ToArray();
            return result;
        }
        static async Task<Dictionary<BookWithLibraryContainer, string>> SearchInPdfText(
            DirectoryInfo directory,
            string containsText = null,
            string containsTitle = null,
            bool printLine = true
            )
        {
            var searchProvider = new SearchProvider(
                new SimplePdfReader()
                );
            var books = await SearchByTitleInDirectory(directory, containsTitle, false);
            books = books
                .Where(
                    e => e.Book.FileData
                        .Any(
                            e2 => string.Equals(e2.Format, "pdf", StringComparison.OrdinalIgnoreCase)
                            )
                )
                .ToArray();
            var result = await searchProvider.GetTextByBooksAsync(
                books,
                true,
                (item, text) =>
                {
                    if (string.IsNullOrEmpty(containsText))
                    {
                        return true;
                    }
                    return text.Contains(containsText, StringComparison.OrdinalIgnoreCase);
                }
                );
            if (printLine)
            {
                foreach (var elem in result)
                {
                    Console.WriteLine($"{elem.Key.Library.Data.Name}|{elem.Key.Book.Title}|{elem.Key.Book.AuthorSort}");
                }
            }
            return result;
        }
        static async Task LoadToDb(
            DirectoryInfo directory,
            string containsText = null,
            string containsTitle = null,
            bool printLine = true
            )
        {
            var searchProvider = new SearchProvider(
                new SimplePdfReader()
                );
            var books = await SearchByTitleInDirectory(directory, containsTitle, false);
            books = books
                .Where(
                    e => e.Book.FileData
                        .Any(
                            e2 => string.Equals(e2.Format, "pdf", StringComparison.OrdinalIgnoreCase)
                            )
                )
                .ToArray();
            await searchProvider.GetTextByBooksAsync(
                books,
                true,
                (item, text) =>
                {
                    if (!string.IsNullOrEmpty(containsText))
                    {
                        if (!text.Contains(containsText, StringComparison.OrdinalIgnoreCase))
                        {
                            return false;
                        }
                    }
                    using (ApplicationContext context = new ApplicationContext())
                    {
                        context.Books.Add(                                
                            new BookTextData()
                            {
                                Directory = item.Library.Data.FullName,
                                Text = text,
                                Title = item.Book.Title
                            }                                
                            );
                        context.SaveChanges();
                    }
                    if (printLine)
                    {
                        Console.WriteLine($"{item.Library.Data.Name}|{item.Book.Title}|{item.Book.AuthorSort}|{text?.Length}");
                    }
                    return false;
                }
                );
        }
    }
}