using FruitBank.Common.Entities;
using FruitBank.Common.Enums;
namespace Nop.Plugin.Misc.FruitBankPlugin.Services;
public interface IOrderDraftService
{
///
/// Egy bejövő szöveges üzenet alapján létrehozza a rendelés tervezet(eke)t.
/// Ha az üzenetben több különböző szállítási dátum szerepel, minden dátumhoz külön draft jön létre.
///
Task> CreateDraftsFromMessageAsync(string externalUsername, string rawMessageText);
/// Egy draft betöltése tételeivel együtt.
Task GetByIdAsync(int id, bool loadRelations = true);
/// Pending draftek listája, opcionálisan szűrve partner szerint.
Task> GetPendingAsync(int? customerId = null);
/// Összes draft lapozhatóan (admin lista).
Task<(List Items, int TotalCount)> GetPagedAsync(
int pageIndex, int pageSize,
OrderDraftStatus? status = null,
int? customerId = null);
///
/// Admin jóváhagyja a draftot: minden tétel SelectedProductId-ja be kell legyen állítva.
/// A dátumtól függően PreOrder vagy Order jön létre.
/// Menti a ProductTextMapping rekordokat a tanuláshoz.
///
Task ApproveAsync(int draftId, int adminId);
/// Admin elutasítja a draftot.
Task RejectAsync(int draftId, int adminId, string? adminNote = null);
/// Admin hozzárendeli a partnert egy mappingból még hiányzó drafthoz.
Task AssignCustomerAsync(int draftId, int customerId, int adminId);
/// Admin frissíti egy tétel kiválasztott termékét és/vagy mennyiségét.
Task UpdateDraftItemAsync(int draftItemId, int selectedProductId, int quantity);
/// 14 napnál régebbi pending draftek automatikus lejáratása (background job hívja).
Task ExpireOldDraftsAsync();
}
public class OrderDraftApproveResult
{
public bool Success { get; set; }
public string? ErrorMessage { get; set; }
/// A létrehozott PreOrder ID-k (ha előrendelés lett).
public List PreOrderIds { get; set; } = [];
/// A létrehozott Order ID-k (ha azonnali rendelés lett).
public List OrderIds { get; set; } = [];
}