namespace Lattice.Core.DragDrop.Abstractions;
///
/// Определяет контракт для объектов, которые могут принимать сбрасываемые данные
/// в операции перетаскивания.
///
///
///
/// Объекты, реализующие этот интерфейс, могут обрабатывать данные, сброшенные
/// пользователем, и предоставлять визуальную обратную связь во время перетаскивания.
///
///
/// Интерфейс поддерживает асинхронные операции и отмену через CancellationToken.
/// Все методы должны быть потокобезопасными и идемпотентными (многократный вызов
/// с одинаковыми параметрами должен давать одинаковый результат).
///
///
public interface IDropTarget
{
///
/// Определяет, может ли объект принять сбрасываемые данные.
///
/// Информация о потенциальном сбросе.
/// Токен отмены операции.
///
/// true, если объект может принять данные; в противном случае — false.
///
///
///
/// Этот метод вызывается, когда перетаскиваемый объект находится над целью.
/// Реализация должна проверить, совместимы ли данные с целью, и установить
/// предлагаемые эффекты в свойстве .
///
///
/// Метод может вызываться многократно при перемещении курсора над целью.
/// Реализация должна быть эффективной и избегать длительных операций.
///
///
/// Если метод возвращает false, система не будет вызывать другие методы
/// для этой цели до тех пор, пока курсор не покинет ее область.
///
///
Task CanAcceptDropAsync(Models.DropInfo dropInfo, CancellationToken cancellationToken = default);
///
/// Вызывается, когда перетаскиваемый объект перемещается над целью.
///
/// Информация о текущем положении перетаскивания.
/// Токен отмены операции.
/// Задача, представляющая асинхронную операцию.
///
///
/// Этот метод вызывается постоянно, пока пользователь перемещает объект над целью.
/// Реализация может:
///
///
/// - Обновить визуальную обратную связь (подсветка, изменение курсора)
/// - Вычислить точную позицию сброса (например, между элементами списка)
/// - Уточнить предлагаемые эффекты на основе текущей позиции
/// - Прокрутить содержимое, если цель поддерживает прокрутку
///
///
/// Метод должен быть оптимизирован для частого вызова. Длительные операции
/// должны выполняться асинхронно без блокировки потока.
///
///
Task OnDragOverAsync(Models.DropInfo dropInfo, CancellationToken cancellationToken = default);
///
/// Вызывается, когда пользователь сбрасывает данные на цель.
///
/// Информация о сбросе, включая данные и позицию.
/// Токен отмены операции.
/// Задача, представляющая асинхронную операцию.
///
///
/// Этот метод вызывается, когда пользователь отпускает кнопку мыши над целью.
/// Реализация должна обработать принятие данных и выполнить соответствующее действие:
///
///
/// - Добавить данные в коллекцию (для копирования)
/// - Переместить данные (при поддержке перемещения)
/// - Создать ссылку на данные
/// - Выполнить пользовательскую логику обработки
///
///
/// После успешной обработки данных следует вызвать ,
/// чтобы указать системе, что операция обработана и дополнительная обработка не требуется.
///
///
/// Если операция завершилась успешно, система уведомит источник через
/// с соответствующими эффектами.
///
///
Task OnDropAsync(Models.DropInfo dropInfo, CancellationToken cancellationToken = default);
///
/// Вызывается, когда перетаскиваемый объект покидает область цели.
///
/// Токен отмены операции.
/// Задача, представляющая асинхронную операцию.
///
///
/// Этот метод вызывается, когда пользователь перемещает объект за пределы цели.
/// Реализация должна:
///
///
/// - Очистить любую визуальную обратную связь, установленную ранее
/// - Сбросить временное состояние, связанное с операцией
/// - Освободить ресурсы, выделенные для предварительного просмотра
///
///
/// Метод гарантированно вызывается после любого успешного или неуспешного
/// вызова , если курсор покидает область цели.
///
///
Task OnDragLeaveAsync(CancellationToken cancellationToken = default);
}