package com.uas.search.service;

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

import com.uas.search.exception.SearchException;
import com.uas.search.model.PageParams;

/**
 * 搜索服务的接口
 * 
 * @author suntg
 * @since 2016年7月29日下午4:58:45
 */
public interface SearchService {

	/**
	 * 根据关键字搜索产品类目id
	 * 
	 * @param keyword
	 *            关键词
	 * @return 符合条件的类目id
	 * @throws SearchException
	 */
	public List<Long> getKindIds(String keyword) throws SearchException;

	/**
	 * 根据关键词搜索产品类目
	 * 
	 * @param keyword
	 * @return
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getKinds(String keyword) throws SearchException;

	/**
	 * 根据关键词搜索产品品牌id
	 * 
	 * @param keyword
	 *            关键词
	 * @return 符合条件的品牌id
	 * @throws SearchException
	 */
	public List<Long> getBrandIds(String keyword) throws SearchException;

	/**
	 * 根据关键词搜索产品品牌
	 * 
	 * @param keyword
	 * @return
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getBrands(String keyword) throws SearchException;

	/**
	 * 根据关键词搜索产品（关键词可能是器件、类目、品牌，甚至可能是类目、品牌的混合）
	 * 
	 * @param keyword
	 * @param params
	 *            额外条件，可能带有翻页信息，filter中可以有：类目id（Long）、品牌id（Long）、属性过滤信息（Map(
	 *            String,Object)可能过滤多个属性，，以属性id为键，以属性值为值）、库存是否不为0（Boolean）、
	 *            现货数量是否不为0（Boolean）、呆滞库存数量是否不为0（Boolean）、样品数量是否不为0（Boolean），
	 *            这些信息以键值对的形式进行传递，键为com.uas.search.utils.SearchConstants中的常量
	 * @return
	 * @throws SearchException
	 */
	public Map<String, Object> getComponentIds(String keyword, PageParams params) throws SearchException;

	/**
	 * 根据产品搜索获取产品类目id的统计
	 * 
	 * @param keyword
	 * @param brandId
	 *            （可选）
	 * @return
	 * @throws SearchException
	 */
	public Set<Long> getKindIdsBySearchComponent(String keyword, String brandId) throws SearchException;

	/**
	 * 根据产品搜索获取产品类目的统计
	 * 
	 * @param keyword
	 * @param brandId
	 *            （可选）
	 * @return
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getKindsBySearchComponent(String keyword, String brandId) throws SearchException;

	/**
	 * 根据产品搜索获取产品品牌id的统计
	 * 
	 * @param keyword
	 * @param kindId
	 *            （可选）
	 * @return
	 * @throws SearchException
	 */
	public Set<Long> getBrandIdsBySearchComponent(String keyword, String kindId) throws SearchException;

	/**
	 * 根据产品搜索获取产品品牌的统计
	 * 
	 * @param keyword
	 * @param kindId
	 *            （可选）
	 * @return
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getBrandsBySearchComponent(String keyword, String kindId) throws SearchException;

	/**
	 * 根据输入获取联想词（包括器件、类目、品牌，按顺序获取，数量不足，才会获取下一个）
	 * 
	 * @param keyword
	 * @return
	 * @throws SearchException
	 */
	public List<String> getSimilarKeywords(String keyword) throws SearchException;

	/**
	 * 根据输入的原厂型号获取联想词
	 * 
	 * @param componentCode
	 * @return 包括id、uuid、code
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getSimilarComponents(String componentCode) throws SearchException;

	/**
	 * 根据输入的品牌获取联想词
	 * 
	 * @param brandName
	 * @return 包括id、uuid、nameCn、nameEn
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getSimilarBrands(String brandName) throws SearchException;

	/**
	 * 根据输入的类目名获取联想词
	 * 
	 * @param kindName
	 * @return 包括id、nameCn、level、isLeaf
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getSimilarKinds(String kindName) throws SearchException;

	/**
	 * 根据输入的类目名获取末级类目联想词
	 * 
	 * @param kindName
	 * @return 包括id、nameCn、level、isLeaf
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getSimilarLeafKinds(String kindName) throws SearchException;

	/**
	 * 根据输入的类目名和指定的类目级别获取联想词
	 * 
	 * @param kindName
	 * @param level
	 * @return 包括id、nameCn、level、isLeaf
	 * @throws SearchException
	 */
	public List<Map<String, Object>> getSimilarKindsByLevel(String kindName, Short level) throws SearchException;

	/**
	 * 根据类目id、属性id、属性值获取联想词
	 * 
	 * @param kindId
	 *            类目id
	 * @param propertyId
	 *            属性id
	 * @param keyword
	 *            （可选） 属性值（部分字符）
	 * @param topNum
	 *            （可选） 获取的最大数目
	 * @return 相似的属性值，包括propertyValue
	 * @throws SearchException
	 */
	public List<Map<String, String>> getSimilarPropertyValues(Long kindId, Long propertyId, String keyword, Long topNum)
			throws SearchException;

}
