package com.ruoyi.project.business.service;

import java.time.LocalDate;
import java.util.List;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.importExcel.excel.helper.BasicTableInfoHelper;
import com.ruoyi.common.importExcel.excel.tempInfo.LeadInfoHelper;
import com.ruoyi.common.importExcel.utils.ExcelUtils;
import com.ruoyi.project.business.domain.TcLead;
import com.ruoyi.project.business.domain.TcLeadForRelated;
import com.ruoyi.project.business.domain.vo.board.BarChartVo;
import com.ruoyi.project.business.domain.vo.lead.*;
import org.springframework.data.util.Pair;

/**
 * 线索管理Service接口
 * 
 * @author ruoyi
 * @date 2024-04-10
 */
public interface ITcLeadService extends IService<TcLead>
{
    /**
     * 查询线索管理
     * 
     * @param leadId 线索管理主键
     * @return 线索管理
     */
    LeadRes selectTcLeadByLeadId(Long leadId);

    /**
     * 查询关联线索
     *
     * @return 线索管理
     */
    List<TcLeadForRelated> selectLeadListByLoginId();
    List<TcLeadForRelated> selectLeadListByLeadId(LeadRelatedQueryReq tcLead);
    List<TcLeadForRelated> selectLeadListByQuery(LeadRelatedQueryReq tcLead);

    /**
     * 查询线索管理列表
     * 
     * @param tcLead 线索管理
     * @return 线索管理集合
     */
    List<LeadRes> selectTcLeadList(LeadListReq tcLead);

    /**
     * 新增线索管理
     * 
     * @param leadFormReq 线索管理
     * @return 结果
     */
    boolean insertTcLead(LeadFormReq leadFormReq);

    /**
     * 修改线索管理
     * 
     * @param tcLead 线索管理
     * @return 结果
     */
    boolean updateTcLead(LeadFormReq tcLead);
    
    /**
     * 查询客户相关线索
     *
     * @param tcLead 线索
     * @return 结果
     */
    List<TcLeadForRelated> selectLeadListByAccount(LeadRelatedQueryReq tcLead);

    /**
     * 回收
     * @param recovery    线索
     * @return
     */
    boolean recovery(RecoveryReq recovery);

    /**
     * 查询市场线索和并且分配线索
     * 
     */
    List<TcLead> selectLeadsFromMarketAndUnassigned();

    /**
     * 分配
     * @param allots 分配线索
     */
    boolean allot(List<AllotReq> allots);

    /**
     * 转化客户
     * @param convertReq
     * @return
     */
    boolean convertCustomer(ConvertReq convertReq);
    /**
     * 转化项目
     * @param leadId 线索ID
     * @param relativeProject 项目ID
     * @return
     */
    boolean convertProject(Long leadId, Long relativeProject);

    /**
     * 获取线索统计数据 半年
     * @return
     */
    BarChartVo getLeadCountStat(LocalDate startDate, LocalDate endDate, String statMode);

    List<LeadRes> curAgent();

    ExcelUtils.UploadResult<LeadInfoHelper> checkLeadImport(BasicTableInfoHelper basicTableInfoHelper, List<LeadInfoHelper> leadInfoHelpers);

    List<String> insertLeadImportExcel(BasicTableInfoHelper basicTableInfoHelper, List<LeadInfoHelper> transform);

    List<TcLead> listByCurUser(LeadForAccountReq forAccountReq);

    List<LeadRes> curCountry();

    /**
     * 转化报价
     *
     * @param leadId    线索ID
     * @param quotationId   报价ID
     */
    boolean convertQuotation(Long leadId, Long quotationId);
    
    /**
     * 项目转化报价，更新线索状态
     *
     * @param projectId    项目ID
     * @param quotationId   报价ID
     */
    boolean convertQuotationFromProject(Long projectId, Long quotationId);
    
    

    // 转化出图
    // boolean convertDrawing(Long... leadIds);

    List<Pair<Long, String>> selectAreasByCurUser();

    List<Pair<Long, String>> selectCountriesByCurUser();

    List<LeadRes> selectTcLeadListExport(LeadListReq tcLead);

    boolean silentOrInvalid(SilentOrInvalidReq silentOrInvalidReq);
}
