package com.fs.qw.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.fs.common.core.domain.R;
import com.fs.qw.domain.QwExternalContact;
import com.fs.qw.dto.GetQwRepeatDataDTO;
import com.fs.qw.param.*;
import com.fs.qw.param.newparam.ExternalContactPageListParam;
import com.fs.qw.result.QwExternalContactLogVo;
import com.fs.qw.result.QwExternalContactVo;
import com.fs.qw.vo.GetQwRepeatDataVO;
import com.fs.qw.vo.QwExternalContactVO;
import com.fs.qw.vo.QwSopRuleTimeVO;
import com.fs.qw.vo.newvo.ExternalContactDetailsVO;
import com.fs.qw.vo.newvo.ExternalContactListVO;
import com.fs.qw.vo.newvo.ExternalContactPageVO;
import com.fs.qwApi.param.QwExternalContactHParam;
import org.codehaus.jettison.json.JSONException;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * 企业微信客户Service接口
 *
 * @author fs
 * @date 2024-06-20
 */
public interface IQwExternalContactService extends IService<QwExternalContact> {
    /**
     * 查询企业微信客户
     *
     * @param id 企业微信客户主键
     * @return 企业微信客户
     */
    public QwExternalContact selectQwExternalContactById(Long id);

    /** 根据外部联系人的userid 获取到所属员工详细信息 */
    public List<QwExternalContact> selectQwExternalContactByExternalUserId(String externalUserId,String corpId);
    /**
     * 预计发送消息人员的客户列表
     */
    public ArrayList<String> selectQwGroupMsgExpectCustomerList(QwCountCustomerParam userIdList, String corpId);

    /**
     *  统计预期发送消息人员的客户总数
     */
    public R expectQwGroupMsgCountCustomer(QwCountCustomerParam userIdList);

    /**
     * 查询企业微信客户列表
     *
     * @param qwExternalContact 企业微信客户
     * @return 企业微信客户集合
     */
    public List<QwExternalContact> selectQwExternalContactList(QwExternalContact qwExternalContact);

    /**
     * 新增企业微信客户
     *
     * @param qwExternalContact 企业微信客户
     * @return 结果
     */
    public int insertQwExternalContact(QwExternalContact qwExternalContact);

    /**
     * 修改企业微信客户
     *
     * @param qwExternalContact 企业微信客户
     * @return 结果
     */
    public int updateQwExternalContact(QwExternalContact qwExternalContact);
    public int updateQwExternalContactCallEdit(QwExternalContact qwExternalContact);

    /**
     * 批量删除企业微信客户
     *
     * @param ids 需要删除的企业微信客户主键集合
     * @return 结果
     */
    public int deleteQwExternalContactByIds(Long[] ids);

    /**
     * 删除企业微信客户信息
     *
     * @param id 企业微信客户主键
     * @return 结果
     */
    public int deleteQwExternalContactById(Long id);

    List<QwExternalContactVO> selectQwExternalContactListVO(QwExternalContactParam qwExternalContact);

    List<QwExternalContactVOTime> selectQwExternalContactListVOByIds(List<Long> ids);

    R syncQwExternalContact(String corpId) throws IOException;

    R syncMyQwExternalContact(Long id) throws IOException;

    R syncQwExternalContactUnassigned(String corpId);

    R resignedTransfer(ResignedTransferParam param);

    R transfer(TransferParam param);

    R addUserTag(QwExternalContactAddTagParam param) throws JSONException;

    R delUserTag(QwExternalContactAddTagParam param);

    void insertQwExternalContactByExternalUserId(String externalUserID, String userID, Long companyId, String corpId, String state, String welcomeCode) throws ParseException;

    void insertQwExternalContactByExternalUserId2(String externalUserID, String userID, Long companyId, String corpId, String state, String welcomeCode) throws ParseException;

    //todo 聊天sop添加营期人员
    void qwChatSopRuleTimeTool(List<QwSopRuleTimeVO> qwSopRuleTimeVOS, String userID,  String corpId, String externalUserID, String externalContactName, QwExternalContact contact);

    void updateQwExternalContactByExternalUserId(String externalUserID, String userID, String corpId);

    void deleteQwExternalContactByExternalUserId(String externalUserID, String userID, String corpId);

    void deletefollowUserByExternalUserId(String externalUserID, String userID, String corpId);

    void transferFailByExternalUserId(String externalUserID, String userID, String corpId,String failReason);

    int updateQwExternalContactStatus(QwExternalContact qwExternalContact);
    /**
     *  企业微信客户与企业客户绑定
     */
    int updateQwExternalContactBindCustomer(QwExternalContact qwExternalContact);

    /**
     * 设置客户-课节SOP
     */
    R setCustomerCourseSop(QwFsCustomerCourseSopParam param);

    /**
     * 查询是否已经设置过客户-某个课节的SOP
     */
    Boolean getCustomerCourseSop(QwFsCustomerCourseSopGetParam param);

    /**
     * 批量设置客户-课节SOP
     */
    R setCustomerCourseSopList(QwFsCustomerCourseSopListParam param);

    R updateQwExternalContactBindUserId(QwExternalContact qwExternalContact);
    R updateQwExternalContactUnBindUserId(Long id);
    QwExternalContact getQwExternalContactDetails(QwExternalContactHParam contactHParam);

    void qwExternalContactSync();

    List<QwExternalContactVo> selectAllQwJoinAdClickLog(Integer type);

    List<QwExternalContactLogVo> selectAllFormAd(ConversionStatisticsParam param);

    R syncAddMyQwExternalContact(Long id);

    void qwExternalContactSyncAddAndDel();

    void qwExternalContactSyncAddRedis();
     void qwExternalContactAddRedis();

    void qwExternalContactAddAndDelByRedis();

    void qwExternalContactAddCourseTag();

    void addQwCourseJob();
    /**
     * 外部联系人分页查询（黑名单分页查询你）
     *
     * @param param 入参对象
     * @return ExternalContactPageVO vo
     */
    List<ExternalContactListVO> externalContactPageList(ExternalContactPageListParam param);

    /**
     * 获取会员数量
     * @param userId 登录用户id
     * @return vo
     */
    ExternalContactPageVO getContactNumber(Long userId);

    /**
     * 获取会员答题情况
     * @param userId 登录用户id
     * @param contactId 外部联系人id
     * @return vo
     */
    ExternalContactDetailsVO getUserDetails(Long userId, Long contactId, String dateTag);

    /**
     * 批量禁用外部联系人
     * @param ids id数组
     * @return 是否成功
     */
    Boolean disabledUser(String[] ids, boolean status);

    List<QwExternalContactVOTime> selectQwExternalContactListVOByUserIds(List<String> externalIdList);

    /**
     * 获取企微重粉数据
     * @param dto
     * @return
     */
    List<GetQwRepeatDataVO> getQwRepeatData(GetQwRepeatDataDTO dto);

    Integer selectQwIsRepeat(Long id);

    /**
     * 根据id查询外部联系人信息
     * @param qwExternalContactId id
     * @return QwExternalContact
     */
    QwExternalContact getQwExternalContactDetailsById(Long qwExternalContactId);

    /**
     * 根据userid修改外部联系人评论状态
     * @param commentStatus 评论状态
     * @param fsUserId 用户id
     * @return
     */
    int updateQwExternalContactByFsUserId(Integer commentStatus, Long fsUserId);

    /**
     * 根据外部联系人ID查询用户是否已购产品
     * @param qwExternalContactId   外部联系人ID
     * @return  Boolean
     */
    Boolean getBuyStatusByExtId(Long qwExternalContactId);
}
