package com.cool.store.mapper;

import com.cool.store.dto.partner.*;
import com.cool.store.dto.partner.PartnerBlackListDTO;
import com.cool.store.dto.partner.PartnerLineInfoAndBaseInfoDTO;
import com.cool.store.dto.partner.StageCountDTO;
import com.cool.store.entity.HyPartnerLineInfoDO;
import org.apache.ibatis.annotations.Param;

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

/**
 * @author zhangchenbiao
 * @date 2023-05-29 03:52
 */
public interface HyPartnerLineInfoMapper {
    /**
     *
     * 默认插入方法，只会给有值的字段赋值
	 * 会对传进来的字段做判空处理，如果字段为空，则使用数据库默认字段或者null
     * dateTime:2023-05-29 03:52
     */
    int insertSelective(@Param("record") HyPartnerLineInfoDO record);

    /**
     * 批量新增线索
     * @param recordList
     * @return
     */
    int batchInsert(@Param("recordList") List<HyPartnerLineInfoDO> recordList);

    /**
     * 批量将线索置为删除状态
     * @param lineIdList
     * @return
     */
    int batchDeleted(@Param("lineIdList") List<Long> lineIdList);

    /**
     * 根据ID查询数据
     * @param id
     * @return
     */
    HyPartnerLineInfoDO selectByPrimaryKeySelective(Long id);


    /**
     *
     * 默认更新方法，根据主键更新，不会把null值更新到数据库，避免覆盖之前有值的
     * dateTime:2023-05-29 03:52
     */
    int updateByPrimaryKeySelective(@Param("record") HyPartnerLineInfoDO record);

    int updateByPrimaryKey(@Param("record") HyPartnerLineInfoDO record);


    /**
     * 当前用户指定时间 临期线索
     * @param userId
     * @param currentDate
     * @return
     */
    List<AdvanceLineDTO> getAdventLineCount(@Param("userId") String userId, @Param("currentDate") String currentDate, @Param("endDate") String endDate);

    /**
     * 招商经理 对应各阶段待处理数据
     * @param userId
     * @return
     */
    StageCountDTO selectStagePendingCount(@Param("userId") String userId);

    /**
     * 招商经理 对应各个阶段 待跟进数据
     * @param userId
     * @return
     */
    StageCountDTO selectStageFollowCount(@Param("userId") String userId);


    /**
     * 查询线索信息与加盟商基本信息
     * @param lineId
     * @return
     */
    PartnerLineInfoAndBaseInfoDTO selectPartnerLineInfoAndBaseInfo(@Param("lineId") Long lineId);

    /**
     * 最近30天结束的线索
     * @param userId
     * @param lastMonthTodayDate
     * @return
     */
    List<HyPartnerLineInfoDO>  lastMonthCloseLine(@Param("userId") String userId,
                                                      @Param("lastMonthTodayDate") String lastMonthTodayDate);

    /**
     * 修改招商经理
     * @param lineIdList
     * @param userId
     * @return
     */
    int updateInvestmentManager(@Param("lineIdList") List<Long> lineIdList, @Param("userId") String userId);

    /**
     * 根据线索ID查询线索
     * @param lineIdList
     * @return
     */
    List<HyPartnerLineInfoDO> getLineListByLineIds(List<Long> lineIdList);

    /**
     * 查询黑名单列表
     * @param userNameKeyword
     * @param phoneKeyword
     * @param intentArea
     * @param acceptAdjustType
     * @return
     */
    List<PartnerBlackListDTO> getBlackList(@Param("userNameKeyword") String userNameKeyword,
                                               @Param("phoneKeyword") String phoneKeyword,
                                               @Param("intentAreaName") String intentAreaName ,
                                               @Param("acceptAdjustType") Integer acceptAdjustType);


    /**
     * 加入/移除 黑名单
     * @param lineId
     * @param status
     * @param joinReason
     * @param removeReason
     * @return
     */
    Boolean joinAndRemoveBlack(@Param("lineId") Long lineId,
                               @Param("status") Integer status,
                               @Param("joinReason") String joinReason,
                               @Param("removeReason") String removeReason);

    HyPartnerLineInfoDO getByPartnerId(@Param("partnerId") String partnerId);



    /**
     * 查询公海线索
     * @param userNameKeyword
     * @param phoneKeyword
     * @param intentArea
     * @param acceptAdjustType
     * @param updateStartTime
     * @param updateEndTime
     * @param userIdList
     * @return
     */
    List<PublicSeaLineDTO> getPublicSeaLineList(@Param("userNameKeyword") String userNameKeyword,
                                                    @Param("phoneKeyword") String phoneKeyword,
                                                    @Param("intentAreaName") String intentAreaName,
                                                    @Param("acceptAdjustType") Integer acceptAdjustType,
                                                    @Param("updateStartTime") String updateStartTime,
                                                    @Param("updateEndTime") String updateEndTime,
                                                    @Param("userIdList") List<String> userIdList);


    /**
     *
     * @return
     */
    List<PrivateSeaLineDTO> getPrivateSeaLineList(@Param("keyword") String keyword,
                                                  @Param("keywordType") String keywordType,
                                                  @Param("workflowStage") String workflowStage,
                                                  @Param("workflowStatus") String workflowStatus,
                                                  @Param("deadlineStart") String deadlineStart,
                                                  @Param("deadlineEnd") String deadlineEnd,
                                                  @Param("intentAreaName") String intentAreaName,
                                                  @Param("acceptAdjustType") Integer acceptAdjustType,
                                                  @Param("storeKeyword") String storeKeyword,
                                                  @Param("storeKeywordType") String storeKeywordType,
                                                  @Param("userIdList") List<String> userIdList,
                                                  @Param("developmentManagerList") List<String> developmentManagerList);


    /**
     * 查询对应的加盟商最近线索
     * @param partnerIdList
     * @return
     */
    List<HyPartnerLineInfoDO> getPartnerLastLine(@Param("partnerIdList") List<String> partnerIdList);

    /**
     * 加盟商跟进次数
     * @param partnerIdList
     * @return
     */
    List<LineCountDTO> getFollowCountList(@Param("partnerIdList") List<String> partnerIdList);


    /**
     * 根据线索ID查询线索数据
     * @param lineIds
     * @return
     */
    List<HyPartnerLineInfoDO> getHyPartnerLineInfoListByIds(@Param("lineIds") List<Long> lineIds);

    /**
     * 跟进历史 及删除状态为1的线索
     * @param partnerId
     * @return
     */
    List<HyPartnerLineInfoDO> getLineFollowHistoryList(String partnerId);

    /**
     * 根据面试计划 id 查询战区 id
     */
    String getAffiliationZoneIdByInterviewPlanId(String interviewPlanId);

    /**
     * 修改线索状态
     */
    void updateWorkflowStatus(@Param("lineId") String lineId, @Param("status") String status);

    List<HyPartnerLineInfoDO> getOverTimeReserveLineList(@Param("deadlineEnd") Date deadlineEnd,
                                                         @Param("workflowStage") String workflowStage,
                                                         @Param("workflowStatus") String workflowStatus);

    List<HyPartnerLineInfoDO> getWaitForOpenInterviewLineList(@Param("startTime") Date startTime,
                                                              @Param("endTime") Date endTime);

    void batchUpdateStatusByLineIds(@Param("lineIds") List<Long> lineIds, @Param("status")Integer status);
}