using System;
using Quik.CommandMachine;
using Quik.Media;

namespace Quik.PAL
{
    /// <summary>
    /// An empty interface to statically type Quik port handles.
    /// </summary>
    public interface IQuikPortHandle
    {
    }

    /// <summary>
    /// The primary primary platform abstraction interface for Quik hosts.
    /// </summary>
    public interface IQuikPlatform : IDisposable
    {
        /// <summary>
        /// The title of the application.
        /// </summary>
        string Title { get; set; }

        /// <summary>
        /// The default icon for the application.
        /// </summary>
        QImage Icon { get; set; }

        /// <summary>
        /// The event raised when an event is received.
        /// </summary>
        event EventHandler EventRaised;

        /// <summary>
        /// Raise the events that have been enqueued.
        /// </summary>
        /// <param name="block">True to block until a new event arrives.</param>
        void ProcessEvents(bool block);

        /// <summary>
        /// Create a window.
        /// </summary>
        /// <returns>The window instance.</returns>
        IQuikPortHandle CreatePort();
        void DestroyPort(IQuikPortHandle port);
        string PortGetTitle(IQuikPortHandle port);
        void PortSetTitle(IQuikPortHandle port, string title);
        QVec2 PortGetSize(IQuikPortHandle port);
        void PortSetSize(IQuikPortHandle port, QVec2 size);
        QVec2 PortGetPosition(IQuikPortHandle port);
        void PortSetPosition(IQuikPortHandle port, QVec2 position);
        bool PortIsValid(IQuikPortHandle port);
        void PortSubscribeEvent(IQuikPortHandle port, EventHandler handler);
        void PortUnsubscribeEvent(IQuikPortHandle port, EventHandler handler);
        void PortFocus(IQuikPortHandle port);
        void PortShow(IQuikPortHandle port, bool shown = true);
        void PortPaint(IQuikPortHandle port, CommandList commands);
    }
}