using System;
using System.Collections.Generic;
using System.IO;
using Quik.Media.Font;

namespace Quik.PAL
{
    /// <summary>
    /// Flags that effect font search criterea.
    /// </summary>
    [Flags]
    public enum FontMatchCriteria
    {
        None = 0,
        Family = 1 << 0,
        Slant = 1 << 1,
        Weight = 1 << 2,
        Stretch = 1 << 3,
        All = Family | Slant | Weight | Stretch,
    }

    /// <summary>
    /// An abstraction over the system font database.
    /// </summary>
    public interface IFontDataBase
    {
        /// <summary>
        /// All the fonts installed in the system.
        /// </summary>
        IEnumerable<FontFace> All { get; }

        public FontFace Serif => GetSystemFontFace(SystemFontFamily.Serif);
        public FontFace Sans => GetSystemFontFace(SystemFontFamily.Sans);
        public FontFace Monospace => GetSystemFontFace(SystemFontFamily.Monospace);
        public FontFace Cursive => GetSystemFontFace(SystemFontFamily.Cursive);
        public FontFace Fantasy => GetSystemFontFace(SystemFontFamily.Fantasy);

        /// <summary>
        /// Search for the given font face.
        /// </summary>
        /// <param name="prototype">The font face prototype.</param>
        /// <param name="criteria">The match criteria</param>
        /// <returns>A list of fonts sorted by the closest match first.</returns>
        IEnumerable<FontFace> Search(FontFace prototype, FontMatchCriteria criteria = FontMatchCriteria.All);

        /// <summary>
        /// Get the font face file info if it exists.
        /// </summary>
        /// <param name="face">The face to look for.</param>
        /// <returns>The file info if it exists.</returns>
        FileInfo FontFileInfo(FontFace face);

        /// <summary>
        /// Open a font face.
        /// </summary>
        /// <param name="face">The font face to open.</param>
        /// <returns>The stream to the font face.</returns>
        Stream Open(FontFace face);

        /// <summary>
        /// Get a system font family.
        /// </summary>
        /// <param name="family">The family type to look up.</param>
        /// <returns>The name of a font in this family.</returns>
        FontFace GetSystemFontFace(SystemFontFamily family);
    }
}