// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import "ICoreState.idl";
import "IControlSettings.idl";
import "EventArgs.idl";

namespace Microsoft.Terminal.Control
{

    // This is a mirror of
    // ::Microsoft::Console::VirtualTerminal::TerminalInput::MouseButtonState,
    // but projectable.
    // !! LOAD BEARING !! If you make this a struct with Booleans (like they
    // make the most sense as), then the app will crash trying to toss one of
    // these across the process boundary. I haven't the damndest idea why.
    [flags]
    enum MouseButtonState
    {
        IsLeftButtonDown = 0x1,
        IsMiddleButtonDown = 0x2,
        IsRightButtonDown = 0x4
    };


    enum ClearBufferType
    {
        Screen,
        Scrollback,
        All
    };

    [default_interface] runtimeclass ControlCore : ICoreState
    {
        ControlCore(IControlSettings settings,
                    Microsoft.Terminal.TerminalConnection.ITerminalConnection connection);

        Boolean Initialize(Double actualWidth,
                           Double actualHeight,
                           Double compositionScale);

        void UpdateSettings(IControlSettings settings);
        void UpdateAppearance(IControlAppearance appearance);

        UInt64 SwapChainHandle { get; };

        Windows.Foundation.Size FontSize { get; };
        String FontFaceName { get; };
        UInt16 FontWeight { get; };

        Boolean TrySendKeyEvent(Int16 vkey,
                             Int16 scanCode,
                             Microsoft.Terminal.Core.ControlKeyStates modifiers,
                             Boolean keyDown);
        Boolean SendCharEvent(Char ch,
                           Int16 scanCode,
                           Microsoft.Terminal.Core.ControlKeyStates modifiers);
        void SendInput(String text);
        void PasteText(String text);
        void ClearBuffer(ClearBufferType clearType);

        void SetHoveredCell(Microsoft.Terminal.Core.Point terminalPosition);
        void ClearHoveredCell();

        void ResetFontSize();
        void AdjustFontSize(Int32 fontSizeDelta);
        void SizeChanged(Double width, Double height);
        void ScaleChanged(Double scale);

        void ToggleShaderEffects();
        void ToggleReadOnlyMode();

        Microsoft.Terminal.Core.Point CursorPosition { get; };
        void ResumeRendering();
        void BlinkAttributeTick();
        void UpdatePatternLocations();
        void Search(String text, Boolean goForward, Boolean caseSensitive);
        void SetBackgroundOpacity(Double opacity);
        Microsoft.Terminal.Core.Color BackgroundColor { get; };

        Boolean HasSelection { get; };
        IVector<String> SelectedText(Boolean trimTrailingWhitespace);

        String HoveredUriText { get; };
        Windows.Foundation.IReference<Microsoft.Terminal.Core.Point> HoveredCell { get; };

        void Close();
        void BlinkCursor();
        Boolean IsInReadOnlyMode { get; };
        Boolean CursorOn;
        void EnablePainting();

        String ReadEntireBuffer();

        event FontSizeChangedEventArgs FontSizeChanged;

        event Windows.Foundation.TypedEventHandler<Object, CopyToClipboardEventArgs> CopyToClipboard;
        event Windows.Foundation.TypedEventHandler<Object, TitleChangedEventArgs> TitleChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> WarningBell;
        event Windows.Foundation.TypedEventHandler<Object, Object> TabColorChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> BackgroundColorChanged;
        event Windows.Foundation.TypedEventHandler<Object, ScrollPositionChangedArgs> ScrollPositionChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> CursorPositionChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> TaskbarProgressChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> ConnectionStateChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> HoveredHyperlinkChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> RendererEnteredErrorState;
        event Windows.Foundation.TypedEventHandler<Object, Object> SwapChainChanged;
        event Windows.Foundation.TypedEventHandler<Object, RendererWarningArgs> RendererWarning;
        event Windows.Foundation.TypedEventHandler<Object, NoticeEventArgs> RaiseNotice;
        event Windows.Foundation.TypedEventHandler<Object, TransparencyChangedEventArgs> TransparencyChanged;
        event Windows.Foundation.TypedEventHandler<Object, Object> ReceivedOutput;

    };
}
