using System.Collections.Generic;
using System.Threading.Tasks;
using GxPress.Entity;
using GxPress.Entity.WorkFlow;
using GxPress.Entity.WorkFlowDto;
using GxPress.Entity.WorkProcessDto;
using GxPress.Request.App.Flow;
using GxPress.Result.App.Flow;

namespace GxPress.Service.Interface
{
    public interface IFlowService : IService
    {
        Task DeleteAsync(int flowId);

        Task<int> AddAsync(FlowDto flow);

        Task<FlowDto> GetAsync(int flowId);

        Task<(string Title, List<string> Summaries)> GetFlowTitleAndSummaryAsync(User user, int processId, int flowId);

        Task<FlowResult> GetFlowResult(int flowId,int userId=0);

        Task<int> GetTodoCountAsync(int userId);

        Task<ListResult> ListAllAsync(int page, int perPage, int processId, string state, string startDate, string endDate);

        Task<ListResult> ListMyCheckingAsync(int userId, FlowListRequest request,string source="");

        Task<ListResult> ListMyCheckedAsync(int userId, FlowListRequest request,string source="");

        Task<ListResult> ListSubmittedCheckingAsync(int userId, FlowListRequest request,string source="");

        Task<ListResult> ListSubmittedCheckedAsync(int userId, FlowListRequest request);

        Task<ListResult> ListCcUnreadAsync(int userId, FlowListRequest request);

        Task<ListResult> ListCcAllAsync(int userId, FlowListRequest request,string source="");

        Task<IEnumerable<FlowTodo>> GetTodoListAsync(int userId, int page, int perPage, int processId);

        Task<List<ProcessNodeDto>> GetNodesAsync(FlowDto flow, List<ProcessNodeDto> nodes);

        Task NodeExecuteAsync(FlowDto flow, ProcessNodeDto node);

        Task CheckAsync(int todoId, bool isChecked, string message);

        Task TransferCheckAsync(int todoId, List<int> transferUserIds, string message, List<int> fileIds);

        Task<string> DownloadAsync(int flowId);

        Task<int> ReAddAsync(int flowId);
          /// <summary>
        /// 上会等待
        /// </summary>
        /// <param name="flowId"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
       Task<bool> ActionsWait(int flowId, int userId);

         /// <summary>
        /// 获取用户ID
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
       Task<List<int>> GetListUserAsync(ProcessNodeDto node);

       Task<bool> RemindAsync(int flowId, int userId);
         /// <summary>
        /// 工作流程条件判断
        /// </summary>
        /// <param name="flow"></param>
        /// <returns></returns>
        Task NodeExecuteSwitchAsync(FlowDto flow, ProcessNodeDto processNode);

        Task<bool> AddInboxAsyc(FlowDto flow);
    }
}