Library.cs
    
    
    
    
    
        Home
            /
src                    /
Calibre.Model.Domain                    /
Entities                    /
                    Library.cs
    
    
            
            using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Collections.Immutable;
using Calibre.Model.Database.Entities;
namespace Calibre.Model.Domain.Entities
{
    /// <summary>
    /// Immutable
    /// </summary>
    public class Library
    {
        #region Properties
        public string Name { private set; get; }
        public string FullName { private set; get; }
        public FileInfo DbFile => new FileInfo(
            Path.Combine(FullName, DbFileName)
            );
        public ImmutableDictionary<string, BookWithLibraryContainer> Books { private set; get; }
            = ImmutableDictionary<string, BookWithLibraryContainer>.Empty;
        #endregion
        private Library() { }
        /// <summary>
        /// SqLite connection
        /// </summary>
        public string BuildConnectionString()
        {
            return $"Filename={DbFile.FullName}";
        }
        #region override
        public override int GetHashCode()
        {
            return FullName.GetHashCode();
        }
        public override bool Equals(object obj)
        {
            if (obj is Library l)
            {
                return string.Equals(FullName, l.FullName);
            }
            return false;
        }
        public override string ToString()
        {
            return FullName;
        }
        #endregion
        #region static
        public static string DbFileName 
            => "metadata.db";
        public static string Cover 
            => "cover.jpg";
        /// <summary>
        /// Поиск всех библиотек в папке
        /// </summary>
        public static Library[] SearchAll(
            DirectoryInfo directory,
            SearchOption searchOption = SearchOption.AllDirectories
            ) 
        {
            var dbFiles = directory
                .GetFiles(
                    DbFileName,
                    searchOption
                    )
                .ToArray();
            var result = dbFiles
                .Select(
                    e => new Library() 
                    { 
                        FullName = e.Directory.FullName,
                        Name = e.Directory.Name
                    }
                    )                
                .ToArray();
            return result;
        }        
        public static Library AddBookContainer(
            Library library,
            BookWithLibraryContainer bookContainer
            )
        {
            try
            {
                var result = new Library()
                {
                    Name = library.Name,
                    FullName = library.FullName
                };
                result.Books = library.Books.Add(
                    bookContainer.Book.Title,
                    bookContainer
                    );
                return result;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        public static string GetPdfFilePath(
            Library library, 
            Book book
            )
        {
            var file = book.FileData.First(
                e => string.Equals(e.Format, "PDF", StringComparison.OrdinalIgnoreCase)
                );
            var result = Path.Combine(
                library.FullName,
                book.Path.Replace('/', '\\'),
                $"{file.Name}.{file.Format}"
                );
            return result;
        }
        public static string GetCoverFilePath(
            Library library,
            Book book
            )
        {
            var result = Path.Combine(
                library.FullName,
                book.Path.Replace('/', '\\'),
                Cover
                );
            return result;
        }
        #endregion
    }
}