using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Finance;

using Lada.Framework.Infrastructures;

namespace Ladaer.BackEnd.Infrastructures.Services.Finance
{
    public interface ICustomerReconciliationSlipService
    {
        /// <summary>
        /// Lấy danh sách khách hàng cần đối soát (có đơn hàng chưa đối soát)
        /// Sale chỉ thấy khách hàng của mình
        /// </summary>
        Task<SmartTableResult<CustomerTransferPaymentSummaryItem>> GetCustomersOverviewAsync(SmartTableParam param, int userId);

        /// <summary>
        /// Lấy danh sách đơn hàng có thể đối soát của một khách hàng
        /// </summary>
        Task<List<CustomerReconciliationSlipDetailItem>> GetReconciliableOrdersAsync(int customerId, int userId);

        /// <summary>
        /// Tạo phiếu đối soát mới
        /// </summary>
        Task<int> CreateSlipAsync(CreateCustomerReconciliationSlipModel model, CurrentUser currentUser);

        /// <summary>
        /// Tìm kiếm phiếu đối soát
        /// </summary>
        Task<SmartTableResult<CustomerReconciliationSlipItem>> GetSlipsAsync(SmartTableParam param, int userId);

        /// <summary>
        /// Lấy chi tiết phiếu đối soát
        /// </summary>
        Task<CustomerReconciliationSlipResult> GetSlipByIdAsync(int id, int userId);

        /// <summary>
        /// Duyệt phiếu (Kế toán)
        /// </summary>
        Task ApproveSlipAsync(int id, CurrentUser currentUser);

        /// <summary>
        /// Từ chối phiếu (Kế toán)
        /// </summary>
        Task RejectSlipAsync(RejectCustomerReconciliationSlipModel model, CurrentUser currentUser);

        /// <summary>
        /// Hoàn thành phiếu (Xác nhận thanh toán)
        /// </summary>
        Task CompleteSlipAsync(CompleteCustomerReconciliationSlipModel model, CurrentUser currentUser);

        /// <summary>
        /// Lấy lịch sử thao tác
        /// </summary>
        Task<List<CustomerReconciliationLogItem>> GetSlipLogsAsync(int id, int userId);
    }
}
