Library.cs

168 lines | 3.847 kB Blame History Raw Download
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
    }
}