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

import com.gic.api.base.commons.BasePageInfo;
import com.gic.api.base.commons.Page;
import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.dto.qdto.TransferActiveCodeQDTO;
import com.gic.haoban.manage.api.dto.role.StoreRoleDTO;

import java.util.List;

public interface StaffApiService {

    StaffDTO selectById(String staffId);

    List<StaffDTO> listByIds(List<String> staffIds);

    StaffDTO selectByNationcodeAndPhoneNumber(String wxEnterpriseId, String nationcode, String phoneNumber);

    List<StaffDepartmentRelatedDTO> listStaffDepartmentByStaffId(String staffId);

    Page<StaffDTO> pageStaff(StaffListDTO staffListDTO);

    /**
     * 保存微信成员
     *
     * @param userId
     * @param wxEnterpriseId
     * @return
     */
    ServiceResponse getWxSaveNew(String userId, String wxEnterpriseId);

    // 是否是同步通讯录,如果是不用每次都查询开启联系我的列表
    ServiceResponse getWxSaveNew(String userId, String wxEnterpriseId ,boolean isSyncDepart);

    /**
     * 新增成员
     *
     * @param userId
     * @param wxEnterpriseId
     */
    ServiceResponse wxGetAdd(String userId, String wxEnterpriseId);

    /**
     * 成员修改
     *
     * @param staffDTO
     * @param departmentIds
     */
    void staffEdit(StaffDTO staffDTO, String departmentIds);

    /**
     * 选择用户id和企业标识
     *
     * @param userId         用户id
     * @param wxEnterpriseId wx企业标识
     * @return {@link StaffDTO }
     * @author mozhu
     * @date 2022-01-13 15:02:22
     */
    StaffDTO selectByUserIdAndEnterpriseId(String userId, String wxEnterpriseId);

    /**
     * 没手机号的时候需要重新刷
     *
     * @param userId
     * @param wxEnterpriseId
     * @return
     */
    StaffDTO getByUserIdAndReflushWhenNoPhone(String userId, String wxEnterpriseId);

    //无效接口
//    StaffDepartmentRelatedDTO getDepartmentIdAndStaffId(String departmentId, String staffId);

//    StaffDepartmentRelatedDTO getDepartmentIdAndCode(String departmentId, String code);

    void initWxUser(String corpid, String contactSecret, String wxEnterpriseId, Integer wxDepartmentId, String taskId);

    List<String> listUnBindClerk(String storeId);

    String insertUserLoginLog(UserLoginLogDTO userLoginLogDTO);

    int countByDepartmentIds(List<String> departmentIds);

    List<StaffDTO> listByPhoneNumber(String phoneNumber);

    /**
     * 获取成员头像
     *
     * @param clerkCode
     * @param storeId
     * @return
     */
    ServiceResponse<String> getStaffQrcode(String clerkCode, String storeId);

    void wxFristAdd(String userJson, String wxEnterpriseId);

    List<String> listBindStaffId(String storeId);
    
    List<String> listBindClerkId(String storeId);

    List<StaffClerkRelationDTO> listBindRelationUserId(String storeId);

    /**
     * 激活
     *
     * @param staffId
     * @return
     */
    boolean activeStaff(String staffId);

    /**
     * 是否隐私
     *
     * @param staffId 员工id
     * @return {@link StaffPrivacyUseLogDTO }
     * @author mozhu
     * @date 2021-12-16 19:53:48
     */
    StaffPrivacyUseLogDTO getStaffPrivacyByStaffId(String staffId);


    /**
     * 让员工隐私员工id
     *
     * @param userId 用户id
     * @return {@link StaffPrivacyUseLogDTO }
     * @author mozhu
     * @date 2022-04-14 14:31:39
     */
    StaffPrivacyUseLogDTO getStaffPrivacyByUserId(String userId);


    /**
     * 用户id wx企业id列表
     *
     * @param wxEnterpriseId wx企业标识
     * @param pageNum        页面num
     * @param pageSize       页面大小
     * @return {@link List<StaffDTO> }
     * @author mozhu
     * @date 2022-02-25 09:40:15
     */
    Page<StaffDTO> listUserIdByWxEnterpriseId(String wxEnterpriseId, Integer pageNum, Integer pageSize);

    /**
     * desc: 查询当前品牌所有员工
     *
     * @param wxEnterpriseId
     * @return : {@link List< StaffDTO>}
     * @author : YongEn
     * @date : 2022/3/23
     */
    //无效接口
//    List<StaffDTO> listAllStaffByWxEnterpriseId(String wxEnterpriseId);


    /**
     * 通过开放用户id和wx企业id列表
     *
     * @param openUserIds    开放的用户id
     * @param wxEnterpriseId wx企业标识
     * @return {@link List<StaffDTO> }
     * @author mozhu
     * @date 2021-12-21 17:23:36
     */
    //无效接口
//    List<StaffDTO> listByOpenUserIdsAndWxEnterpriseId(List<String> openUserIds, String wxEnterpriseId);


    /**
     * 更新开放用户id,用户id
     *
     * @param wxEnterpriseId wx企业标识
     * @param wxUserId       wx用户id
     * @param wxOpenUseId    wx开放使用id
     * @return int
     * @author mozhu
     * @date 2021-12-21 19:53:30
     */
    int updateOpenUserIdsByUserId(String wxEnterpriseId, String wxUserId, String wxOpenUseId);


    /**
     * 更新开放id员工id
     *
     * @param staffId 员工id
     * @param openId  开放id
     * @return int
     */
    int updateOpenIdByStaffId(String staffId, String openId);

    /**
     * 判断成员是否授权获取敏感信息，0否 1是
     * @param staffId
     * @return
     */
    int getSensitiveStatus(String staffId);

    /**
     * 更新二维码通过员工id
     *
     * @param staffId 员工id
     * @param qrCode  二维码
     * @return int
     */
    int updateQrCodeByStaffId(String staffId, String qrCode);

    /**
     * 通过userID更新员工二维码
     * @param userId
     * @param qrCode
     * @return
     */
    int updateQrCodeByUserId(String userId, String qrCode);


    /**
     * 获取职员id二维码
     *
     * @param clerkId 职员id
     * @return {@link StaffQrCodeDTO}
     */
    StaffQrCodeDTO getQrCodeByClerkId(String clerkId);

    /**
     * 导购gic门店和好办企业门店交集
     * 所有门店返回 -1
     *
     * @param clerkId        职员id
     * @param wxEnterpriseId wx企业标识
     * @return {@link List }<{@link String }>
     * @author mozhu
     * @date 2022-06-01 11:04:40
     */
    List<String> getHaoBanStoreIdsRolesByClerkId(String clerkId, String wxEnterpriseId);

    /**
     * 导购gic门店和好办企业门店交集
     *
     * 当管理员是所有门店权限的时候：返回为空
     * @param clerkId
     * @param wxEnterpriseId
     * @param storeStatusList 可以为空，为空则查询全部。门店状态筛选： 状态（0：无效，2：上线，3：未上线，-3：回收站 ， 4占坑 ，6:停业整顿），7待上线
     * @param addUnassignedStore 当符合条件时，是否需要无归属门店Id  -1 的数据，如果需要，则添加到返回集合中。默认不需要。
     * @return
     */
    List<String> getHaobanStoreIdsRolesByClerkIdAndStoreStatus(String clerkId, String wxEnterpriseId, List<String> storeStatusList, Boolean addUnassignedStore);

    /**
     * 导购gic门店和好办企业门店交集(比返回门店Id)
     * 当管理员是所有门店权限的时候返回所有门店id
     * @param clerkId
     * @param wxEnterpriseId
     * @param storeStatusList 可以为空，为空则查询全部。门店状态筛选： 状态（0：无效，2：上线，3：未上线，-3：回收站 ， 4占坑 ，6:停业整顿），7待上线
     * @param addUnassignedStore 当符合条件时，是否需要无归属门店Id  -1 的数据，如果需要，则添加到返回集合中。默认不需要。
     * @return
     */
    List<String> getNotEmptyHaobanStoreIdsRolesByClerkIdAndStoreStatus(String clerkId, String wxEnterpriseId, List<String> storeStatusList, Boolean addUnassignedStore);

    List<String> isGicSuper(String clerkId , String wxEnterpriseId) ;


    /**
     * 门店筛选器id和好办企业门店交集
     *
     * @param storeWidgetId  存储部件id
     * @param wxEnterpriseId wx企业标识
     * @param enterpriseId   企业标识
     * @return {@link List }<{@link String }>
     * @author mozhu
     * @date 2022-05-31 09:35:42
     */
    List<String> getHaoBanStoreRolesByStoreWidgetId(String storeWidgetId, String wxEnterpriseId, String enterpriseId);


    /**
     * 该门店好办是否有权限 true有，false 否
     *
     * @param storeId        存储id
     * @param enterpriseId   企业标识
     * @param wxEnterpriseId wx企业标识
     * @return boolean
     * @author mozhu
     * @date 2022-05-18 14:19:11
     */
    boolean isFlagByStoreIdAndEnterpriseId(String storeId, String enterpriseId, String wxEnterpriseId);


    /**
     * 是否超级管理员 true是
     *
     * @param clerkId 职员id
     * @return boolean
     * @author mozhu
     * @date 2022-05-27 09:43:00
     */
    //无效接口
//    boolean isSuperAdmin(String clerkId);


    /**
     * 获取到好办的企业门店id
     *
     * @param enterpriseId   企业标识
     * @param wxEnterpriseId wx企业标识
     * @return {@link List }<{@link String }>
     * @author mozhu
     * @date 2022-05-30 11:46:08
     */
    //无效接口
//    List<String> getHaoBanStoreRolesByEnterpriseId(String enterpriseId, String wxEnterpriseId);


    /**
     *
     * 获取区经管辖门店数量
     *
     * @param wxEnterpriseId wx企业标识
     * @param clerkId        职员id
     * @return int
     */
    StoreRoleDTO getCountHaoBanStoreIdsByClerkId(String clerkId, String wxEnterpriseId);

    /**
     * 是否店长权限 true 是
     * @param clerkId
     * @return
     */
    boolean isManager(String clerkId);
    
    /**
     * 
    * @Title: isEnterpriseManager
    * @Description: 是否是区经
    * @author xugh
    * @param clerkId
    * @return
    * @throws
     */
    com.gic.api.base.commons.ServiceResponse<Boolean> isEnterpriseManager(String clerkId) ;


    /**
     * 绑定的员工列表
     *
     * @param storeIds        存储id
     * @param wxEnterpriseId wx企业标识
     * @return {@link List }<{@link StaffDTO }>
     * @author mozhu
     * @date 2022-10-21 00:25:46
     */
    List<StaffDTO> listBindStoreIds(List<String> storeIds,String wxEnterpriseId);

    /**
     * 转移员工许可
     */
    com.gic.api.base.commons.ServiceResponse<TransferActiveCodeDTO> batchTransferLicense(List<TransferActiveCodeQDTO> transferActiveCodeQOList,String wxEnterpriseId);

    /**
     * 企业微信自动激活回调通知
     * @param params 回调参数
     * @return
     */
    com.gic.api.base.commons.ServiceResponse<Boolean> autoActivateCallBack(String params) ;

    /**
     * 查询企业微信对应的所有商户品牌信息
     * @param wxEnterpriseId 企业微信id
     * @return
     */
    com.gic.api.base.commons.ServiceResponse<List<WxEnterpriseRelatedDTO>> getWxEnterpriseRelatedList(String wxEnterpriseId);
    /**
     * 定时任务
     * 刷新企业成员外部联系人
     * @param params 企业微信id,多个按”，“隔开
     */
    com.gic.api.base.commons.ServiceResponse<Boolean> updateExternalUserId(String params);
    /**
     * 定时任务
     * 同步企业微信通讯录列表
     * @param params 回调参数
     * @return
     */
    com.gic.api.base.commons.ServiceResponse<Boolean> syncQywxStaffList(String params) ;

    com.gic.api.base.commons.ServiceResponse<StaffActiveAllocationDTO> staffActiveAllocation(String wxEnterpriseId,String staffIds);

    void updateStaffHead(String wxEnterpriseId ,String staffId, String headUrl);

    Page<StaffDTO> listByParams(String enterpriseId , String params, String wxEnterpriseId, BasePageInfo pageInfo) ;


    void deleteStaff(String enterpriseId , String clerkId) ;

}
