package cn.pluss.platform.userApp;

import cn.pluss.platform.api.Result;
import cn.pluss.platform.dto.MerchSearchDTO;
import cn.pluss.platform.dto.StaffDTO;
import cn.pluss.platform.entity.UserApp;
import cn.pluss.platform.enums.UserRoleEnum;
import cn.pluss.platform.leshua.ExpandDto;
import cn.pluss.platform.mapper.UserAppMapper;
import cn.pluss.platform.vo.*;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface UserAppService extends IService<UserApp> {

    /**
     * 多个userId拼接成的字符串
     *
     * @param userIds 用户id串
     * @return
     */
    Map<String, Object> getUserByUid(String userIds);

    default UserApp appGetOne(Wrapper<Object> queryWrapper) {
        return ((UserAppMapper) getBaseMapper()).selectUserApp(queryWrapper);
    }

    default UserApp queryUserApp(UserApp userApp) {
        return getBaseMapper().selectOne(new QueryWrapper<>(userApp));
    }

    default List<UserApp> queryUserAppList(UserApp userApp) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppList(userApp);
    }

    default void updateUserAppUserId(UserApp userApp) {
        ((UserAppMapper) getBaseMapper()).updateUserAppUserId(userApp);
    }

    default Integer queryUserAppPageCount(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppPageCount(map);
    }

    Page<UserInfoVO> queryUserInfoVOPage(Map<String, Object> map);

    /**
     * 未实名信息
     *
     * @return
     */
    default List<UserExpandVO> queryUserAppNoRealNamePage(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppNoRealNamePage(map);
    }

    /**
     * 未实名统计数量
     *
     * @param map
     * @return
     */
    default Integer queryUserAppNoRealNamePageCount(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppNoRealNamePageCount(map);
    }


    /**
     * queryUserAppRealNamePage:(已实名认证信息). <br/>
     *
     * @param map
     * @return
     * @author Administrator
     * @since JDK 1.8
     */
    default List<UserExpandVO> queryUserAppRealNamePage(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppRealNamePage(map);
    }

    /**
     * queryUserAppRealNamePage:(已实名认证条数). <br/>
     *
     * @param map
     * @return
     * @author Administrator
     * @since JDK 1.8
     */
    default Integer queryUserAppRealNamePageCount(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppRealNamePageCount(map);
    }


    /**
     * 是商户的信息
     *
     * @param map
     * @return
     */
    default List<UserExpandVO> queryUserAppIsMerchantPage(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppIsMerchantPage(map);
    }

    /**
     * 是商户信息统计数量
     *
     * @param map
     * @return
     */
    default Integer queryUserAppIsMerchantPageCount(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppIsMerchantPageCount(map);
    }


    /**
     * saveStaff:(添加员工). <br/>
     *
     * @param staffDTO
     * @return
     * @throws Exception
     * @author Administrator
     * @since JDK 1.8
     */
    Result<Map<String, Object>> saveStaff(StaffDTO staffDTO);

    /**
     * deleteStaff:(删除员工). <br/>
     *
     * @param id
     * @return
     * @author Administrator
     * @since JDK 1.8
     */
    Result<Map<String, Object>> deleteStaff(Long id);

    UserApp queryUserAppByToken();

    /**
     * 获取拓展商户列表.
     * 传递
     *
     * @param dto
     * @return
     */
    Map<String, Object> expandMerchantList(ExpandDto dto);

    default List<UserApp> queryUserAppListByPhone(UserApp userApp) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppListByPhone(userApp);
    }

    default List<UserApp> queryUserAppPageByPhone(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppPageByPhone(map);
    }

    default Integer queryUserAppPageCountByPhone(Map<String, Object> map) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppPageCountByPhone(map);
    }

    default UserApp getUserAppByUserId(Serializable userId) {
        return ((UserAppMapper) getBaseMapper()).selectByUserId(userId);
    }

    default UserApp selectInfoJoinByUserId(Serializable userId) {
        return ((UserAppMapper) getBaseMapper()).selectInfoJoinByUserId(userId);
    }

    /**
     * 查询一个用户开的所有店铺的流水信息
     *
     * @return
     */
    Map<String, Object> queryAllMerchantFee(String userId, String merchantUserId);

    /**
     * 根据inviteNum查询用户信息
     *
     * @param inviteNum inviteNum
     * @return
     */
    default UserApp queryUserAppByInviteNum(String inviteNum) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppByInviteNum(inviteNum);
    }

    /**
     * 获取商户交易信息，以及总和
     *
     * @param dto
     * @return
     */
    Map<String, Object> getMerchantListByCondition(ExpandDto dto);

    /**
     * 获取商户交易信息，以及总和
     *
     * @param page           分页参数
     * @param merchSearchDTO 查询参数
     * @return
     */
    Map<String, Object> getMerchantListByConditionV2(Page<MerchSummaryVO> page, MerchSearchDTO merchSearchDTO);

    /**
     * 根据推广员id关联查询商户信息，结算信息
     *
     * @return
     */
    default UserApp queryUserAppJoinById(Long userId) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppJoinById(userId);
    }

    /**
     * 进件接口
     *
     * @param jsonObject
     * @throws Exception
     */
    void merchantAudit(JSONObject jsonObject, String channelId);

    /**
     * 商户进件请求, 待我们审核
     */
    void merchantAuditReq();

    /**
     * 进件修改, 当前特指修改结算信息，只允许修改结算信息
     */
    void editMerchantAudit(String userId);

    UserApp queryUserBaseInfoByToken();

    default UserApp queryUserAppJoinByUserId(Long userId) {
        return ((UserAppMapper) getBaseMapper()).queryUserAppJoinByUserId(userId);
    }

    /**
     * 保存员工信息
     *
     * @param userApp 员工信息
     */
    void appSaveStaffInfo(UserApp userApp);

    Integer getUserAppWithChannelStatus(QueryWrapper<UserApp> queryWrapper);

    Map<String, Object> agentStaffShareInfo();

    /**
     * 关联查询分页
     *
     * @param page    分页
     * @param userApp 查询参数
     * @return 分页查询结果
     */
    Page<UserApp> pageJoinData(Page<UserApp> page, UserApp userApp);

    List<String> storeMemberList(String merchantCode);

    /**
     * 获取下级商户数量
     *
     * @param userId 用户id
     * @return 下级商户数量
     */
    Integer getSubUserCount(Long userId, String startDate, String endDate);

    /**
     * 分页查询活动商户详情列表
     *
     * @param userInfoVO 查询参数
     */
    Page<UserInfoVO> queryActPage(Page<UserInfoVO> page, UserInfoVO userInfoVO);


    Integer getParentUserId(Integer parentUserId);

    Integer getUserId(String merchantCode);

    Map<String, Object> getStaffPage(Integer currPage, Integer size, UserInfoVO userInfoVO);

    /**
     * 拉起支付宝或者微信支付
     *
     * @param userApp 用户信息
     * @param type    付款方式. 1：支付宝; 2: 微信支付
     * @return 订单信息
     */
    Map<String, Object> getLevelUpOrder(UserApp userApp, String type);

    /**
     * 拉起支付宝或者微信支付
     *
     * @param userApp 用户信息
     * @param level   目标等级
     * @return 订单信息
     */
    Map<String, Object> getLevelUpOrderV2Info(UserApp userApp, String level);

    /**
     * 拉起支付宝或者微信支付
     *
     * @param userApp 用户信息
     * @param type    付款方式. 1：支付宝; 2: 微信支付
     * @param level   目标等级
     * @return 订单信息
     */
    Map<String, Object> getLevelUpOrderV2(UserApp userApp, String type, String level);

    /**
     * 获取老板userApp
     *
     * @param userAppStaff 员工userApp
     * @return 老板userApp
     */
    UserApp getBossUserApp(UserApp userAppStaff);

    /**
     * 获取老板userApp
     *
     * @param userId 用户id
     * @return 老板userApp
     */
    UserApp getBossUserApp(Integer userId, String merchantCode);

    Page<UserApp> appPageStaff(UserApp userApp);

    /**
     * 后台调整用户实名审核状态
     *
     * @param userId     用户ID
     * @param status     状态, 2、不通过;
     * @param certReason 驳回理由
     */
    void userCert(String userId, Integer status, String certReason);

    /**
     * @return java.util.Map<java.lang.String, java.lang.Object>
     * @description:首页统计数据
     * @date: 2021/10/19 17:23
     */
    Map<String, Object> getPlatformData();

    Integer getMaxSort();

    /**
     * 获取直推用户的新增数量和总数
     *
     * @param userId:
     * @param date:
     * @param dateType:
     * @return cn.pluss.platform.vo.UserNumVO
     * @date: 2022/1/24 23:25
     */
    UserNumVO getUserNumInfo(Long userId, String date, Integer dateType);

    /**
     * 检查wap请求token
     *
     * @param token:
     * @param request:
     * @param roleEnum:
     * @date: 2022/2/16 14:18
     */
    UserApp checkWapToken(String token, HttpServletRequest request, UserRoleEnum roleEnum);

    /**
     * 根据邀请码获取用户信息
     *
     * @param inviteNum:
     * @param zyBst:
     * @return cn.pluss.platform.entity.UserApp
     * @date: 2022/2/16 15:53
     */
    UserApp getUserAppByInviteNum(String inviteNum, UserRoleEnum zyBst);

    /**
     * 保存bst代理账号
     *
     * @param params:
     * @date: 2022/2/16 17:54
     */
    void bstSaveAgent(Map<String, Object> params);

    /**
     * 校验API用户登录TOKEN
     *
     * @return
     */
    UserApp checkApiToken();

    /**
     * 根据手机号获取用户信息
     *
     * @param phone
     * @param userApp
     * @return
     */
    UserApp getUserAppByPhone(String phone, UserApp userApp);
}

