using System;
using System.Collections.Generic;
using UnityEngine;

namespace Unity.VisualScripting
{
    public interface ICanvas : IDisposable, IDragAndDropHandler
    {
        void Cache();

        #region Model

        ICanvasWindow window { get; set; }

        IGraph graph { get; }

        WidgetProvider widgetProvider { get; }

        GraphSelection selection { get; }

        #endregion


        #region Widgets

        IEnumerable<IWidget> widgets { get; }

        void Recollect();

        void CacheWidgetCollections();

        #endregion


        #region Hovering

        IWidget hoveredWidget { get; }

        #endregion


        #region Deleting

        void DeleteSelection();

        #endregion


        #region Clipboard

        void ShrinkCopyGroup(HashSet<IGraphElement> copyGroup);

        #endregion


        #region Lifecycle

        void RegisterControls();

        void Open();

        void Close();

        void Update();

        void BeforeFrame();

        void OnGUI();

        #endregion


        #region Viewing

        float zoom { get; }

        Vector2 pan { get; }

        void UpdateViewport();

        Rect viewport { get; set; }

        Vector2 mousePosition { get; }

        bool isMouseOver { get; }

        bool isMouseOverBackground { get; }

        void ViewElements(IEnumerable<IGraphElement> elements);

        bool IsVisible(IWidget widget);

        #endregion


        #region Positioning

        void CacheWidgetPositions();

        #endregion


        #region Lassoing

        bool isLassoing { get; }

        Rect lassoArea { get; }

        #endregion


        #region Selecting

        bool isSelecting { get; }

        Rect selectionArea { get; }

        #endregion


        #region Grouping

        bool isGrouping { get; }

        Rect groupArea { get; }

        #endregion


        #region Dragging

        bool isDragging { get; }

        void BeginDrag(EventWrapper e);

        void Drag(EventWrapper e);

        void EndDrag(EventWrapper e);

        #endregion


        #region Layout

        void Align(AlignOperation operation);

        void Distribute(DistributeOperation operation);

        #endregion


        #region Timing

        float frameDeltaTime { get; }

        float eventDeltaTime { get; }

        float repaintDeltaTime { get; }

        #endregion


        #region Window

        void OnToolbarGUI();

        event Action delayCall;

        Queue<Action> delayedCalls { get; }

        #endregion
    }
}