package org.hzhub.crm.service;

import org.hzhub.common.mybatis.core.page.PageQuery;
import org.hzhub.common.mybatis.core.page.TableDataInfo;
import org.hzhub.crm.domain.bo.CrmLeadBo;
import org.hzhub.crm.domain.bo.CrmLeadConvertBo;
import org.hzhub.crm.domain.bo.CrmLeadFollowBo;
import org.hzhub.crm.domain.vo.CrmLeadFollowVo;
import org.hzhub.crm.domain.vo.CrmLeadStatsVo;
import org.hzhub.crm.domain.vo.CrmLeadVo;

import java.util.List;

/**
 * CRM线索 Service 接口
 *
 * @author hzhub
 */
public interface ICrmLeadService {

    /**
     * 分页查询线索列表
     *
     * @param lead      线索查询条件
     * @param pageQuery 分页参数
     * @return 线索列表
     */
    TableDataInfo<CrmLeadVo> selectPageLeadList(CrmLeadBo lead, PageQuery pageQuery);

    /**
     * 查询线索详情
     *
     * @param leadId 线索ID
     * @return 线索详情
     */
    CrmLeadVo selectLeadById(Long leadId);

    /**
     * 获取线索统计数据
     *
     * @return 线索统计VO
     */
    CrmLeadStatsVo getLeadStats();

    /**
     * 新增线索
     *
     * @param lead 线索信息
     * @return 结果
     */
    int insertLead(CrmLeadBo lead);

    /**
     * 修改线索
     *
     * @param lead 线索信息
     * @return 结果
     */
    int updateLead(CrmLeadBo lead);

    /**
     * 批量删除线索
     *
     * @param leadIds 线索ID数组
     * @return 结果
     */
    int deleteLeadByIds(Long[] leadIds);

    /**
     * 分配线索
     *
     * @param leadId      线索ID
     * @param ownerUserId 负责人ID
     * @return 结果
     */
    int assignLead(Long leadId, Long ownerUserId);

    /**
     * 查询线索跟进记录列表
     *
     * @param leadId 线索ID
     * @return 跟进记录列表
     */
    List<CrmLeadFollowVo> selectFollowRecordsByLeadId(Long leadId);

    /**
     * 添加跟进记录
     *
     * @param follow 跟进记录信息
     * @return 结果
     */
    int insertFollowRecord(CrmLeadFollowBo follow);

    /**
     * 校验手机号是否唯一
     *
     * @param lead 线索信息
     * @return 结果
     */
    boolean checkMobileUnique(CrmLeadBo lead);

    /**
     * 线索转经销商
     *
     * @param convert 转化参数
     * @return 结果
     */
    int convertToDealer(CrmLeadConvertBo convert);

    /**
     * 作废线索
     *
     * @param leadId 线索ID
     * @return 结果
     */
    int invalidateLead(Long leadId);

    /**
     * 恢复线索
     *
     * @param leadId 线索ID
     * @return 结果
     */
    int restoreLead(Long leadId);
}