using ErsatzTV.Application.Emby;
using ErsatzTV.Application.Jellyfin;
using ErsatzTV.Core.Domain;

namespace ErsatzTV.Application.Libraries;

internal static class Mapper
{
    public static LibraryViewModel ProjectToViewModel(Library library) =>
        library switch
        {
            LocalLibrary l => ProjectToViewModel(l),
            PlexLibrary p => new PlexLibraryViewModel(
                p.Id,
                p.Name,
                p.MediaKind,
                p.MediaSourceId,
                GetServerName(p.MediaSource)),
            JellyfinLibrary j => new JellyfinLibraryViewModel(
                j.Id,
                j.Name,
                j.MediaKind,
                j.ShouldSyncItems,
                j.MediaSourceId),
            EmbyLibrary e => new EmbyLibraryViewModel(e.Id, e.Name, e.MediaKind, e.ShouldSyncItems, e.MediaSourceId),
            _ => throw new ArgumentOutOfRangeException(nameof(library))
        };

    public static LocalLibraryViewModel ProjectToViewModel(LocalLibrary library) =>
        new(library.Id, library.Name, library.MediaKind, library.MediaSourceId);

    public static LocalLibraryPathViewModel ProjectToViewModel(LibraryPath libraryPath) =>
        new(libraryPath.Id, libraryPath.LibraryId, libraryPath.Path);

    private static string GetServerName(MediaSource ms) =>
        ms switch
        {
            PlexMediaSource pms => pms.ServerName,
            _ => string.Empty
        };
}
