package com.starry.admin.modules.clerk.service;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.starry.admin.modules.clerk.module.entity.PlayClerkLevelInfoEntity;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserQueryVo;
import com.starry.admin.modules.clerk.module.entity.PlayClerkUserReturnVo;
import com.starry.admin.modules.clerk.module.vo.PlayClerkUnsettledWagesInfoQueryVo;
import com.starry.admin.modules.clerk.module.vo.PlayClerkUnsettledWagesInfoReturnVo;
import com.starry.admin.modules.statistics.module.vo.PlayClerkPerformanceInfoQueryVo;
import com.starry.admin.modules.weichat.entity.PlayClerkUserLoginResponseVo;
import com.starry.admin.modules.weichat.entity.clerk.PlayClerkUserInfoQueryVo;
import com.starry.admin.modules.weichat.entity.clerk.PlayClerkUserInfoResultVo;
import java.math.BigDecimal;
import java.util.List;

/**
 * 店员Service接口
 *
 * @author admin
 * @since 2024-03-30
 */
public interface IPlayClerkUserInfoService extends IService<PlayClerkUserInfoEntity> {

    /**
     * 根据分组ID查询店员列表
     *
     * @param typeId
     *            分类ID
     * @return 店员列表
     */
    List<PlayClerkUserInfoEntity> listAllByTypeId(String typeId);

    /**
     * 根据分组ID查询店员列表
     *
     * @param groupId
     *            分组ID
     * @return 店员列表
     */
    List<PlayClerkUserInfoEntity> listAllByGroupId(String groupId);

    /**
     * 查询当前租户店员总数
     *
     * @param tenantId
     *            租户ID
     * @return 店员总数
     */
    Long getTotalClerkUser(String tenantId);

    /**
     * 获取当前店员抽成信息
     *
     * @param clerkId
     *            店员ID
     * @return com.starry.admin.modules.clerk.module.entity.PlayClerkLevelInfoEntity
     * @author admin
     * @since 2024/6/3 11:29
     **/
    PlayClerkLevelInfoEntity queryLevelCommission(String clerkId);

    /**
     * 查询店员
     *
     * @param openId
     *            微信ID
     * @return 店员
     */
    PlayClerkUserInfoEntity selectByOpenid(String openId);

    /**
     * 查询店员
     *
     * @param id
     *            店员主键
     * @return 店员
     */
    PlayClerkUserInfoEntity selectById(String id);

    /**
     * 获得陪聊用户登录返回信息
     *
     * @param vo
     *            PlayClerkUserInfoEntity
     * @return PlayClerkUserLoginResponseVo
     */
    PlayClerkUserLoginResponseVo getVo(PlayClerkUserInfoEntity vo);

    /**
     * 更新token
     *
     * @param id
     *            用户ID
     * @param token
     *            token
     * @author admin
     * @since 2024/4/9 14:30
     **/
    void updateTokenById(String id, String token);

    /**
     * 更新账号余额
     *
     * @param id
     *            用户ID
     * @param accountBalance
     *            账户余额
     * @author admin
     * @since 2024/4/9 14:33
     **/
    void updateAccountBalanceById(String id, BigDecimal accountBalance);

    /**
     * 更新店员账户余额信息
     *
     * @param userId
     *            用户ID
     * @param balanceBeforeOperation
     *            操作前余额
     * @param balanceAfterOperation
     *            操作后余额
     * @param operationType
     *            操作类型（0:充值;1:消费;2:服务）
     * @param operationAction
     *            操作动作
     * @param balanceMoney
     *            操作金额
     * @param orderId
     *            订单ID
     */
    void updateAccountBalanceById(String userId, BigDecimal balanceBeforeOperation, BigDecimal balanceAfterOperation,
            String operationType, String operationAction, BigDecimal balanceMoney, String orderId);

    /**
     * 查询当前租户下所有店员
     *
     * @return 店员列表
     */
    List<PlayClerkUserInfoEntity> listAll();

    /**
     * 查询店员未结算订单
     *
     * @param vo
     *            未结算订单查询对象
     * @return 未结算订单
     */
    IPage<PlayClerkUnsettledWagesInfoReturnVo> listUnsettledWagesByPage(PlayClerkUnsettledWagesInfoQueryVo vo);

    /**
     * 管理端分页查询店员信息
     *
     * @param vo
     *            店员查询实体
     * @return 店员列表
     */

    IPage<PlayClerkUserInfoEntity> selectByPage(PlayClerkPerformanceInfoQueryVo vo);

    /**
     * 管理端分页查询店员信息
     *
     * @param vo
     *            店员查询实体
     * @return 店员列表
     */

    IPage<PlayClerkUserReturnVo> selectByPage(PlayClerkUserQueryVo vo);

    /**
     * 查询店员列表
     *
     * @param vo
     *            店员查询对象
     * @param customUserId
     *            顾客ID
     * @return 店员列表
     */
    IPage<PlayClerkUserInfoResultVo> selectByPage(PlayClerkUserInfoQueryVo vo, String customUserId);

    /**
     * 查询店员列表
     *
     * @param vo
     *            店员查询对象
     * @return 店员集合
     */
    IPage<PlayClerkUserInfoResultVo> selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo);

    /**
     * 构建面向顾客的店员详情视图对象（包含媒资与兼容相册）。
     *
     * @param clerkId
     *            店员ID
     * @param customUserId
     *            顾客ID（可为空，用于标记关注状态）
     * @return 店员详情视图对象
     */
    PlayClerkUserInfoResultVo buildCustomerDetail(String clerkId, String customUserId);

    /**
     * 确认店员处于可用状态，否则抛出异常
     *
     * @param clerkUserInfoEntity
     *            店员信息
     */
    void ensureClerkIsActive(PlayClerkUserInfoEntity clerkUserInfoEntity);

    /**
     * 确认店员登录态仍然有效（未被离职/下架/删除），否则抛出异常
     *
     * @param clerkUserInfoEntity
     *            店员信息
     */
    void ensureClerkSessionIsValid(PlayClerkUserInfoEntity clerkUserInfoEntity);

    /**
     * 使店员当前登录态失效
     *
     * @param clerkId
     *            店员ID
     */
    void invalidateClerkSession(String clerkId);

    /**
     * 新增店员
     *
     * @param playClerkUserInfo
     *            店员
     * @return 结果
     */
    boolean create(PlayClerkUserInfoEntity playClerkUserInfo);

    /**
     * 修改店员
     *
     * @param playClerkUserInfo
     *            店员
     * @return 结果
     */
    boolean update(PlayClerkUserInfoEntity playClerkUserInfo);

    /**
     * 批量删除店员
     *
     * @param ids
     *            需要删除的店员主键集合
     * @return 结果
     */
    int deletePlayClerkUserInfoByIds(String[] ids);

    /**
     * 删除店员信息
     *
     * @param id
     *            店员主键
     * @return 结果
     */
    int deletePlayClerkUserInfoById(String id);

    List<PlayClerkUserInfoEntity> simpleList();

    /**
     * 查询存在相册字段数据的店员（忽略租户隔离）
     *
     * @return 店员集合
     */
    List<PlayClerkUserInfoEntity> listWithAlbumIgnoringTenant();

    JSONObject getPcData(PlayClerkUserInfoEntity entity);
}
