using System.Threading.Tasks;
using Datory;
using GxPress.EnumConst;
using System.Transactions;
using System.Linq;

namespace GxPress.Service.Implement
{
    public partial class FlowService
    {
        /// <summary>
        /// 撤回
        /// </summary>
        /// <param name="flowId"></param>
        /// <returns></returns>
        public async Task<bool> RecallAsync(int flowId, int userId)
        {
            try
            {
                using (var transactions = new TransactionScope())
                {
                    var flow = await _flowRepository.GetAsync(flowId);
                    if (flow == null || flow.UserId != userId)
                        throw new Common.Exceptions.BusinessException("非本人操作!");
                    var query = Q.NewQuery();
                    query.Where(nameof(Entity.Notice.SourceId), flowId);
                    var notices = await _noticeRepository.GetAllAsync(query);
                    if (notices == null || notices.Count() == 0)
                        return false;
                    var notice = notices.FirstOrDefault(n => n.UserId == userId);
                    if (notice == null)
                        return false;
                    query = Q.NewQuery();
                    query.Where(nameof(Entity.Notice.Id), notice.Id);
                    query.Set(nameof(Entity.Notice.IsRecall), true);
                    await _noticeRepository.UpdateAsync(query);
                    //删除middle
                    query = Q.NewQuery();
                    query.Where(nameof(Entity.Middle.Middle.FolderType), AllTypeConst.Inbox.GetHashCode());
                    query.WhereIn(nameof(Entity.Middle.Middle.MiddleId), notices.Select(n => n.Id));
                    query.WhereNot(nameof(Entity.Middle.Middle.UserId), flow.UserId);
                    await middleRepository.DeleteAsync(query);
                    //修改状态
                    query = Q.NewQuery();
                    query.Where(nameof(Entity.Middle.Middle.FolderType), AllTypeConst.Inbox.GetHashCode());
                    query.Where(nameof(Entity.Middle.Middle.MiddleId), notices.Select(n => n.Id));
                    query.Where(nameof(Entity.Middle.Middle.UserId), flow.UserId);
                    query.Set(nameof(Entity.Middle.Middle.IsRecall), true);
                    await middleRepository.UpdateAsync(query);
                    transactions.Complete();
                }
            }
            catch
            {
                return false;
            }
            return true;
        }
    }
}