using Deal.Modules.Cards.Application;
using Deal.Modules.Kanban.Application;
using Deal.Modules.Kanban.Application.Models;
namespace Deal.Infrastructure.Services;
///
/// Единая точка перехода карточки между контейнерами — реализация порта
/// (R4 этапа 9).
///
///
/// Маршрутизация цели живёт в домене: цель-стадия пространства «Выбранные»
/// () переходит через —
/// запись истории движения и сброс напоминания; остальные цели (доски/служебные зоны) — штатный перенос
/// дашборда (журнал CardMoves, matchHits, обучение ML).
/// Адаптер только нормализует результаты обоих маршрутов к ; снимок карточки
/// эндпоинт перечитывает единым чтением. Scoped: зависимости живут в рамках tenant-запроса.
///
/// Сервис карточек — единый домен перехода (стадии и контейнеры дашборда).
public sealed class CardMover(CardsService cardsService) : ICardMover
{
///
public async Task MoveAsync(
string cardId, string toContainerId, TransitionContext ctx, CancellationToken ct)
{
// Контекст перехода (инициатор/обучение) учтён внутри маршрутов: дашборд-перенос обучает ML по
// цели пользователя, переход по стадии пишет историю и сбрасывает напоминание. Отдельного
// ветвления по ctx сейчас нет — оно появится с политиками контейнеров (R4).
CardResultDto result = CardsDefaultContainers.Contains(toContainerId)
? await cardsService.MoveStageCardAsync(cardId, toContainerId, ct)
: await cardsService.MoveDashboardCardAsync(cardId, toContainerId, ct);
return result.Error is not null
? new CardMoveResultDto(result.Error, Exists: true)
: new CardMoveResultDto(null, Exists: result.Card is not null);
}
}