package com.fs.crm.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone;
import com.fs.crm.domain.CrmCustomerProperty;

import java.util.List;
import java.util.Map;

/**
 * 客户属性服务接口
 * @author 
 * @date 
 */
public interface ICrmCustomerPropertyService extends IService<CrmCustomerProperty> {

    /**
     * 根据ID查询客户属性
     * @param id 客户属性ID
     * @return 客户属性对象
     */
    CrmCustomerProperty selectCrmCustomerPropertyById(Long id);

    /**
     * 查询客户属性列表
     * @param crmCustomerProperty 客户属性查询条件
     * @return 客户属性列表
     */
    List<CrmCustomerProperty> selectCrmCustomerPropertyList(CrmCustomerProperty crmCustomerProperty);

    /**
     * 新增客户属性
     * @param crmCustomerProperty 客户属性信息
     * @return 新增结果（1-成功，0-失败）
     */
    int insertCrmCustomerProperty(CrmCustomerProperty crmCustomerProperty);

    /**
     * 修改客户属性
     * @param crmCustomerProperty 客户属性信息
     * @return 修改结果（1-成功，0-失败）
     */
    int updateCrmCustomerProperty(CrmCustomerProperty crmCustomerProperty);

    /**
     * 批量删除客户属性
     * @param ids 客户属性ID数组
     * @return 删除结果（删除的记录数）
     */
    int deleteCrmCustomerPropertyByIds(Long[] ids);

    /**
     * 根据ID删除客户属性
     * @param id 客户属性ID
     * @return 删除结果（1-成功，0-失败）
     */
    int deleteCrmCustomerPropertyById(Long id);

    /**
     * 根据客户ID查询客户属性列表
     * @param customerId 客户ID
     * @return 客户属性列表
     */
    List<CrmCustomerProperty> selectCrmCustomerPropertyByCustomerId(Long customerId);

    /**
     * 添加客户属性
     * @param customerId 客户ID
     * @param propertyId 属性ID
     * @param propertyName 属性名称
     * @param propertyValue 属性值
     * @param propertyValueType 属性值类型
     * @param tradeType 交易类型
     * @param createBy 创建人
     * @return 添加结果（1-成功，0-失败）
     */
    int addCustomerProperty(Long customerId, Long propertyId, String propertyName, String propertyValue, String propertyValueType, String tradeType, String createBy);

    /**
     * 添加或更新客户属性
     * @param customerId 客户ID
     * @param propertyId 属性ID
     * @param propertyName 属性名称
     * @param propertyValue 属性值
     * @param propertyValueType 属性值类型
     * @param tradeType 交易类型
     * @param createBy 创建人
     * @return 操作结果（1-成功，0-失败）
     */
    int addOrUpdateCustomerProperty(Long customerId, Long propertyId, String propertyName, String propertyValue, String propertyValueType, String tradeType, String createBy);

    /**
     * 添加或更新客户属性（带额外信息）
     * @param customerId 客户ID
     * @param propertyId 属性ID
     * @param propertyName 属性名称
     * @param propertyValue 属性值
     * @param propertyValueType 属性值类型
     * @param tradeType 交易类型
     * @param intention 意向
     * @param likeRatio 喜欢比例
     * @param createBy 创建人
     * @return 操作结果（1-成功，0-失败）
     */
    int addOrUpdateCustomerPropertyWithExtra(Long customerId, Long propertyId, String propertyName, String propertyValue, String propertyValueType, String tradeType, String intention, Integer likeRatio, String createBy);

    /**
     * 批量添加客户属性
     * @param customerId 客户ID
     * @param properties 客户属性列表
     * @return 添加结果（添加的记录数）
     */
    int batchAddCustomerProperties(Long customerId, List<CrmCustomerProperty> properties);

    /**
     * 根据属性模板ID添加客户属性
     * @param customerId 客户ID
     * @param propertyTemplateId 属性模板ID
     * @param propertyValue 属性值
     * @param createBy 创建人
     * @return 添加结果（1-成功，0-失败）
     */
    int addPropertyByTemplateId(Long customerId, Long propertyTemplateId, String propertyValue, String createBy);

    /**
     * 根据属性模板ID添加或更新客户属性
     * @param customerId 客户ID
     * @param propertyTemplateId 属性模板ID
     * @param propertyValue 属性值
     * @param createBy 创建人
     * @return 操作结果（1-成功，0-失败）
     */
    int addOrUpdatePropertyByTemplateId(Long customerId, Long propertyTemplateId, String propertyValue, String createBy);

    /**
     * 批量根据属性模板ID添加客户属性
     * @param customerId 客户ID
     * @param propertyMap 属性模板ID和属性值的映射
     * @param createBy 创建人
     * @return 添加结果（添加的记录数）
     */
    int batchAddPropertiesByTemplateIds(Long customerId, Map<Long, String> propertyMap, String createBy);

    void addPropertyByCallLog(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLog);
}
