package com.gic.haoban.manage.api.service;

import com.gic.api.base.commons.Page;
import com.gic.haoban.base.api.common.BasePageInfo;
import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.manage.api.dto.ClerkStaffWxUserDTO;
import com.gic.haoban.manage.api.dto.ExternalClerkRelatedDTO;
import com.gic.haoban.manage.api.dto.ExternalClerkRelatedShortInfoDTO;
import com.gic.haoban.manage.api.dto.FriendMemberStatusDTO;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * Created by tgs on 2020/2/9.
 */
public interface ExternalClerkRelatedApiService {

    /**
     * 查询会员在企业下的好友关系
     *
     * @param memberId       : 会员id
     * @param wxEnterpriseId : 微信企业id
     * @param enterpriseId   : 企业id
     * @return : 返回会员导购关联关系
     */
    List<ExternalClerkRelatedDTO> listByMemberIdAndWxEnterpriseId(String memberId, String wxEnterpriseId, String enterpriseId);

    List<ExternalClerkRelatedDTO> listByMemberIdList(List<String> memberIdList, String wxEnterpriseId, String enterpriseId);

    List<ExternalClerkRelatedDTO> listByWxEnterpriseIdAndWxUserId(String staffId, String wxEnterpriseId);

    List<ExternalClerkRelatedDTO> listByWxEnterpriseIdAndWxUserIds(List<String> staffIdList, String wxEnterpriseId);

    /**
     * 根据关联key查询待关联的记录-触达待完善记录
     *
     * @return
     */
    ExternalClerkRelatedDTO getExternalClerkByRelationKeyAndPre(String relationKey);

    /**
     * 根据关联key查询待关联的记录
     *
     * @return
     */
    Page<ExternalClerkRelatedDTO> pageExternalClerk(String wxEnterpriseId, String staffId, List<Integer> statusFlags, BasePageInfo pageInfo);

    /**
     * 推送外部联系人 更新次数以及状态
     *
     * @param relationKey
     * @return
     */
    boolean pushExternalByRelationKey(String relationKey);

    @Deprecated
    List<ExternalClerkRelatedDTO> listByEnterpriseIdAndDate(String enterpriseId, Date date);

    Page<ExternalClerkRelatedDTO> pageMemberUnionByParams(List<String> userIdList, List<String> sendMemberIds,
                                                          String enterpriseId, BasePageInfo pageInfo);


    /**
     * 推送外部联系人 更新次数以及状态（会员回调-绑定好友）
     *
     * @param relationKey
     * @param enterpriseId
     * @param memberId
     * @param unionid
     * @return
     */
    ServiceResponse<ExternalClerkRelatedDTO> bindMemberIdExternalByRelationKey(String relationKey, String enterpriseId, String memberId, String unionid);

    /**
     * 绑定好友-关注公共号
     *
     * @param externalClerkRelatedId
     * @param enterpriseId
     * @param memberId
     * @param unionid
     * @return {@link ExternalClerkRelatedDTO }
     * @author mozhu
     * @date 2022-02-09 16:57:19
     */
    boolean bindMemberIdExternalById(String externalClerkRelatedId, String enterpriseId, String memberId, String unionid);

    /**
     * 查询clerk与union好友关系
     *
     * @param enterpriseId
     * @return
     */
    //无效接口
//    ExternalClerkRelatedDTO getClerkFriendByUnionid(String enterpriseId, String clerkId, String unionid);

    /**
     * 获取企业下的关联关系列表
     *
     * @return
     */
    ExternalClerkRelatedDTO getExternalClerkByWxUserIdAncExternalUserId(String wxEnterpriseId, String staffId, String enterpriseId, String externalUserId);

    /**
     * 根据id查询列表
     *
     * @param wxEnterpriseId
     * @param ids
     * @return
     */
    List<ExternalClerkRelatedDTO> listByIds(String wxEnterpriseId, List<String> ids);

    /**
     * 查询导购好友关联
     *
     * @param wxEnterpriseId : 微信企业id
     * @return : 返回好友关联
     */
    Page<String> pageExternalByEnterpriseId(String wxEnterpriseId, String enterpriseId, BasePageInfo pageInfo);

    /**
     * 查询导购好友关联
     *
     * @param wxEnterpriseId : 微信企业id
     * @return : 返回好友关联
     */
    Page<String> pageExternalByEnterpriseId(String wxEnterpriseId, String enterpriseId, int pageNum, int pageSize);


    /**
     * 获取企业下的关联关系的 memberIds
     *
     * @return
     */
    List<String> listExternalClerkMemberIdsByMemberIds(String wxEnterpriseId, List<String> memberIds);

    /**
     * 通过会员id查询好友门店id
     *
     * @param memberId 成员身份
     * @return {@link List }<{@link String }>
     * @author mozhu
     * @date 2022-07-06 14:39:28
     */
    List<String> listStoreIdByMemberId(String memberId);

    /**
     * 获取该企业会员下的关联关系列表
     *
     * @param memberId     成员身份
     * @param enterpriseId 企业标识
     * @return {@link List }<{@link ExternalClerkRelatedShortInfoDTO }>
     * @author mozhu
     * @date 2022-03-29 10:19:24
     */
    List<ExternalClerkRelatedShortInfoDTO> listExternalClerkByMemberId(String memberId, String enterpriseId);

    /**
     * 这个是所有企业下的会员关联关系 性能很差
     * 获取会员下的关联关系列表
     *
     * @param memberId
     * @return
     */
    @Deprecated
    List<ExternalClerkRelatedShortInfoDTO> listExternalClerkByMemberId(String memberId);


    /**
     * gic删除会员或者合并会员
     *
     * @param memberId      旧会员ID
     * @param enterpriseId  企业标识
     * @param mergeMemberId 合并后的会员ID 删除传null，
     * @author mozhu
     * @date 2021-09-13 16:52:31
     */
    void delByMemberIdAndEnterpriseId(String memberId, String enterpriseId, String mergeMemberId);
    // 0 删除会员 1合并会员 2会员换绑
    void delByMemberIdAndEnterpriseId(String memberId, String enterpriseId, String mergeMemberId, int type);

    /**
     * 导购和会员是否好友关系，true是好友
     *
     * @param memberId     会员id
     * @param clerkId      导购id
     * @param enterpriseId 企业ID
     * @return boolean
     * @author mozhu
     * @date 2021-10-15 11:36:36
     */
    boolean isFriends(String memberId, String clerkId, String enterpriseId);
    
    com.gic.api.base.commons.ServiceResponse<Boolean> isQwFriend(String enterpriseId, String staffId, String memberId) ;



    List<String> listMemberAndStaff(List<String> memberIdList , String StaffId , String enterpriseId) ; 

    /**
     *
     * @param enterpriseId
     * @param clerkId
     * @param unionId
     * @return
     */
    com.gic.api.base.commons.ServiceResponse<Boolean> isQwFriendWithUnionId(String enterpriseId, String clerkId, String unionId) ;

    /**
     * 批量查询会员与导购好友关系
     *
     * @param memberIdList   会员id列表
     * @param clerkIdList    导购id列表
     * @param enterpriseId   企业id
     * @param wxEnterpriseId wx企业标识
     * @return {@link Map<String, List<ClerkStaffWxUserDTO>> }
     * @author mozhu
     * @date 2021-12-23 15:43:03
     */
    Map<String, List<ClerkStaffWxUserDTO>> listMemberStaffRel(List<String> memberIdList, List<String> clerkIdList, String enterpriseId, String wxEnterpriseId);


    /**
     * 根据企业更新新的外部联系人id
     *
     * @param wxEnterpriseId wx企业标识
     * @return boolean
     * @author mozhu
     * @date 2021-12-13 15:37:57
     */
    ServiceResponse updateNewExternalUserid(String wxEnterpriseId);

    /**
     * 获取导购的好有数
     *
     * @param clerkId
     * @return
     */
    int countFriendCountByClerkId(String wxEnterpriseId, String enterpriseId, String staffId, String clerkId);


    /**
     * 更新新的外部userid mq
     * <p>
     * routerName ："updateNewExUserIdMq"
     *
     * @param res res
     * @author mozhu
     * @date 2021-12-30 16:24:02
     */
    void updateNewExternalUseridMq(String res);

    /**
     * 当前企业好友关系列表
     *
     * @param memberId     会员id
     * @param enterpriseId 企业标识
     * @return {@link List<ExternalClerkRelatedShortInfoDTO> }
     * @author mozhu
     * @date 2022-01-19 16:52:12
     */
    List<ExternalClerkRelatedShortInfoDTO> listByMemberIdAndEnterpriseId(String memberId, String enterpriseId);


    /**
     * 根据wxuserid和会员unionid进行查询数据
     *
     * @param wxEnterpriseId wx企业标识
     * @param wxUserId       wx用户id
     * @param unionid        unionid
     * @return {@link ExternalClerkRelatedDTO }
     * @author mozhu
     * @date 2022-03-11 15:23:13
     */
    ExternalClerkRelatedDTO getByWxEnterpriseIdAndUnionId(String wxEnterpriseId, String staffId, String unionid);


    /**
     * 会员是否有好友 true:是 false:否
     *
     * @param memberId     成员身份
     * @param enterpriseId 企业标识
     * @return boolean
     * @author mozhu
     * @date 2022-04-21 10:03:44
     */
    boolean isExternalFriendByMemberId(String memberId, String enterpriseId);

    /**
     * 得到好友状态
     *
     * @param memberId     成员身份
     * @param enterpriseId 企业标识
     * @return {@link FriendMemberStatusDTO }
     * @author mozhu
     * @date 2022-04-15 16:57:30
     */
    FriendMemberStatusDTO getFriendMemberStatus(String memberId, String enterpriseId);


    /**
     * @param wxEnterpriseId
     * @throws
     * @Title: initWxEnterpriseFrient
     * @Description: 初始化整个商户的好友
     * @author xugh
     */
    void initWxEnterpriseFriend(String wxEnterpriseId);

    int getCountExternalClerk(String wxEnterpriseId, String staffId, List<Integer> statusFlags);
    
    int updateExternalStatus(String wxEnterpriseId , String externalUserid,int status) ;
}
