package com.ssj.service.weixin.sales.service;

import com.ssj.bean.curator.TbVacationLimit;
import com.ssj.bean.weixin.libmy.domain.LibVip;
import com.ssj.bean.weixin.sales.domain.LibVipService;
import com.ssj.framework.core.common.service.BaseService;
import com.ssj.framework.core.util.ResponseEntity;
import com.ssj.service.conch.common.request.PayVipBatchReq;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

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

/** 
 * @author  ZhangCaibao 
 * @version 2017年6月22日 下午3:50:35 
 * 类说明 
 */
public interface LibVipServiceService extends BaseService<LibVipService, String>{
	
	public  Page<LibVipService>  findByPage(Map<String, Object> params, Pageable sp);
    /**
     * 购卡后新增服务
    * @param libId  图书馆ID
    * @param species  服务的种类  S001会员卡，S003VIP专席卡（作业吧）， S010一对一
    * @param type     服务的具体明细 
    * @param vipId    vipId 会员卡ID
    * @param startTime  开始时间，
    * @param endTime    结束时间
    * 创建人：ZhangCaibao 
    * 2017年6月23日 上午11:50:05 
    * @void
     */
	public void saveLibVipService(String libId,String species,String type,String vipId,Date startTime,Date endTime,String orderDetailsId );

	/**
	 * 购卡后新增服务
	 * @param libId
	 * @param species
	 * @param type
	 * @param vipId
	 * @param beginTime
	 * @param number
	 * @param orderDetailsId
	 */
	void saveLibVipServiceV1(String libId, String species, String type, String vipId, Date beginTime, Integer number, String orderDetailsId);

	/**
	 * 购卡后新增服务
	 * @param species
	 * @param type
	 * @param vipId
	 * @param beginTime
	 * @param number
	 * @param orderDetailsId
	 */
	void saveLibVipServiceV2(String species, String type, String vipId, Date beginTime, Integer number, String orderDetailsId);

	void saveLibVipServiceV3(String species, String type, String vipId, Date beginTime, Integer number, String orderDetailsId);

	/**
	 * 新增服务
	 * @param species 服务类型
	 * @param type 子服务类型
	 * @param vipId 会员id
	 * @param beginTime 服务开始时间
	 * @param endTime 服务结束时间
	 * @param number 服务数量  如果有了结束时间，则不需要数量
	 * @param orderDetailsId 订单编号，赠送填写随意
	 */
	void saveLibVipServiceV4(String species, String type, String vipId, Date beginTime, Date endTime, Integer number, String orderDetailsId);

	/**
	 *
	 * @param species
	 * @param type
	 * @param vipId
	 * @param beginTime
	 * @param endTime
	 * @param number
	 * @param orderDetailsId 订单编号，赠送填写随意
	 * @param libId 绑定馆id
	 */
	LibVipService saveLibVipServiceV4(String species, String type, String vipId, Date beginTime, Date endTime, Integer number, String orderDetailsId, String libId);

	/**
	 * 赠送永久服务
	 *
	 * @param vipId
	 */
	void saveLibVipServiceForever(String vipId);

	public void saveLibVipService(String libId,String species,String type,String vipId,Date startTime,Date endTime,String orderDetailsId,Integer courseCount );
	/**
	 *  获取vip卡普通卡的服务
	* @param vipId
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:31:11 
	* @void
	 */
	public LibVipService getVipIdPTService(String vipId);
	/**
	 *  获取vip卡普通卡的服务
	 * @param vipId
	 * 创建人：ZhangCaibao 
	 * 2017年6月26日 上午10:31:11 
	 * @void
	 */
	public LibVipService getVipIdService(String vipId);
	public LibVipService getVipIdService(String vipId ,String species,String libId);
	/**
	 *  获取vip卡有那个图书馆普通卡的服务
	* @param vipId
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:31:11 
	* @void
	 */
	public LibVipService getVipIdPTService(String vipId,String libId);
	/**
	 * 获取是否有vip卡普通卡的服务
	* @param vipId
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:44:59 
	* @Integer
	 */
	public Integer getVipIdPTServiceCount(String vipId);
	/**
	 * 获取vip卡有那个图书馆普通卡的服务
	* @param vipId
	* @param libId
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月27日 下午4:53:47 
	* @Integer
	 */
	public Integer getVipIdPTServiceCount(String vipId,String libId);
	/**
	 *  获取vip卡专席卡的服务（同伴作业吧）
	* @param vipId
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:31:11 
	* @void
	 */
	public LibVipService getVipIdZXService(String vipId);
	/**
	 *  获取vip卡专席卡的服务（同伴作业吧）
	* @param vipId
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:31:11 
	* @void
	 */
	public LibVipService getVipIdZXService(String vipId,String libId);

	/**
	 * 获取批改服务，到期就服务失效，没有超期5天的说法
	 * @param libVip
	 * @param libId
	 * @return
	 */
	public LibVipService getVipIdZXService5days(LibVip libVip, String libId);
	public LibVipService getVipIdService5days(String vipId ,String species,String libId);
	public LibVipService getVipIdZXService5days(String vipId);
	/**
	 *  获取是否有vip卡专席卡的服务（同伴作业吧）
	* @param vipId
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:45:22 
	* @Integer
	 */
	public Integer getVipIdZXServiceCount(String vipId);
	
	public Integer getVipIdServiceCount(String vipId ,String species);
	/**
	 * 获取vip卡有那个图书馆专席卡的服务（同伴作业吧）
	* @param vipId
	* @param libId
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月27日 下午4:54:16 
	* @Integer
	 */
	public Integer getVipIdZXServiceCount(String vipId,String libId);
	/**
	 * 同伴作业吧 计算逾期5天内的，也算有效。
	* @param vipId
	* @param libId
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月27日 下午4:54:16 
	* @Integer
	 */
	public Integer getVipIdExpired5days(String vipId ,String species,String libId);
	
	/**
	 * 判断该会员是否有该图书馆的服务
	* @param vipId
	* @param libId
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月26日 上午10:51:26 
	* @Integer
	 */
	public Integer getVipIdAndLibIdCount(String vipId,String libId);
	
	/**
	 * 馆长看服务
	* @param searchParams
	* @param pageable
	* @return
	* 创建人：ZhangCaibao 
	* 2017年6月28日 上午11:12:23 
	* @Page<Map<String,Object>>
	 */
	 Page<Map<String, Object>> findForPage(Map<String, Object> searchParams, Pageable pageable);


	 /**
	  * 尊享卡插入该管的服务
	 * @param vipId
	 * @param libId
	 * 创建人：ZhangCaibao 
	 * 2017年7月24日 下午4:24:38 
	 * @void
	  */
	 public void insertIntoVipIdServiceAndLibId(String vipId,String libId);
	 /**
	  *  修改服务的状态   1生效 2 失效
	 * @param id
	 * @param stat
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年6月28日 上午11:12:53 
	 * @Integer
	  */
	 public Integer updateStat(String id,Integer stat);
	 /**
	  * 退款后修改服务的状态
	 * @param orderDeatalId
	 * 创建人：ZhangCaibao 
	 * 2017年6月28日 下午2:09:39 
	 * @void
	  */
	 public void  updateVipServiceStat(String orderDeatalId);
	 public void  updateVipServiceByVipId(String vipId);

	public void  updateVipServiceStatByVipId(String vipId);



	/**
	  * 统计该图书馆所有有效的会员卡
	  * @param libId
	  * @return
	  * @Integer
	  */
	 public Integer getByLibIdCount(String libId,Date selectDate);
	 /**
	  * 查询有效的卡类型总数
	 * @param libId
	 * @param species
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年10月16日 下午1:59:36 
	 * @Integer
	  */
	 public Integer getByLibIdAndSpeciesCount(String libId,String species);
	 public Integer getByLibIdAndSpeciesCount(String species);
	 public Integer getByLibIdAndSpeciesCount(List<String> libIds, List<String> species, String masterId);
	 /**
	  * 查询该会员有多少会员服务，有效和过期的
	 * @param userId 
	 * @param species  S001 图书馆服务，S003作业吧服务
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年10月19日 上午10:09:04 
	 * @List<String>
	  */
	 public List<LibVipService> getByUserIdAndSpeciesCount(String userId,String species);
	 
	 /**
	  *  取得该vip ，在lib_id ,有效期最大的一条，然后根据条件查询且失效的一条数据
	 * @param vipId
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年10月19日 下午3:13:14 
	 * @List<LibVipService>
	  */
	 public List<Map<String, Object>> getLibAllService(String vipId,String species);
	 /**
	  * 获取所有馆的服务只取最近的一条服务
	 * @param userId
	 * @return
	 * 创建人：ZhangCaibao 
	 * 2017年10月19日 下午3:13:14 
	 * @List<LibVipService>
	  */
	 public List<LibVipService> getLibServiceAll(String userId,String species);
	 
	 /**
		* 获取vip卡普通卡只否只有周末卡服务
		* @param vipId
		* 创建人：wuwen 
		* 2017年11月3日14:43:02
		* @void
		 */
	 public boolean isVipIdAndWeekService(String vipId,String type );

	 /**
		* 获取vipid是否有S004服务 
		* @param vipId
		* 创建人：ZhangCaibao 
		* 2017年6月26日 上午10:31:11 
		* @void
		 */
	 public LibVipService getVipIdCuService(String vipId);
	 
	 /**
	  * 
	  * @Title: findIsHaveJiaSer
	  * @Description: 查询
	  * @param @param id
	  * @return Integer    返回类型
	  * @author shenhao
	  * @date 2017年12月28日 上午10:25:42
	  * @throws
	  */
	  public Integer findIsHaveJiaSer(String id,String libId);
	  
	  public Integer getMouthServiceCount(String id, String libId, String species, String type);
	  
	  public Integer getOcBuyServiceCount(String id, String libId, String species, String type);
	 
	  /**
	   * 
	   * @Title: isVipHasJiaSer
	   * @Description:判断是否启用寒暑假
	   * @param @param id
	   * @param @param libId
	   * @param @param type 2---签到 1---借阅
	   * @param @return   是否在寒暑假范围
	   * @return boolean    返回类型
	   * @author shenhao
	   * @date 2018年1月15日 下午3:41:59
	   * @throws
	   */
	  public boolean isVipHasJiaSer(String id, String libId,String type);
	  
	  public List<Map<String, Object>> findUserServiceList(String id, String libId);
	  /**
	   * 
	   * @Title: getLibVipService
	   * @Description: 查询所在馆会员所有服务的最新的一条服务
	   * @param @param vipId
	   * @param @param libId
	   * @return LibVipService    返回类型
	   * @author shenhao
	   * @date 2018年3月5日 上午10:57:43
	   * @throws
	   */
	  public LibVipService getLibVipService(String vipId, String libId);

	/**
	 * 查询最近的一个作业吧服务
	 * @param vipId
	 * @return
	 */
	LibVipService findLastZybService(String vipId);
	  
	  
	  public Map<String,Object> findLibVipService(String libId,String species,String type,String vipId,Integer num);
	  
	  public Integer findJiaServiceByLib(String id, String libId);
	  public Integer getVipServiceByAccount(String openid);

	  public List<Map<String, Object>> getVipService(String[] vipIds, String[] species);

	  public int countDistinctByLibId(String libId);

	  List<LibVipService> findByLibId (String libId);

	  List<LibVipService> findByVipIdInAndSpeciesAndLibIdIn (String[] vipIds, String[] libIds, String[] species);
	  

	 public Page<Map<String, Object>> findTeacherList(Map<String, Object> searchParams, Pageable pageable);
	 
	 void  updateByLibIdAndVipIdAndCourseHour(String vipId,String libId,String courseHour);
	 
	 public List<LibVipService> getByVipIdAndSpecies(String vipId ,String species);

	 List<LibVipService> getByVipIdAndSpeciesOrderByCreateTimeDesc(String vipId, String species);
	 /**
	 * @param vipId
	 * @return
	
	 * 方法说明:检查小孩是否有作业吧|贝壳服务
	
	 * 创立日期:2018年11月27日 下午2:37:30
	 * 创建人:yangcan
	
	 */
	int checkIsZybServiceByVipId(String vipId);

	/**
	 * 获取当前服务（不区分家长购买和平台购买）
	 *
	 * @param vipId
	 * @return
	 */
	int getCurrentCorrectService(String vipId);

	/**
	 * 获取详细的当前批改服务（0：无服务，1：家长购买平台批改服务，2：机构服务，3：家长批改服务,4:机构购买平台批改服务,999内部用户）
	 *
	 * @param vipId
	 * @return
	 */
	int getDetailedCurrentCorrectService(String vipId);

	/**
	 * 检测是否有作业吧服务
	 * @param vipId
	 * @return
	 */
	int checkIsZybServiceByVipIdV2(String vipId);

	/**
	 * 检查小孩是否有作业吧服务
	 * @param vipId
	 * @return
	 */
	int checkIsOnlyZybServiceByVipId(String vipId);

	List<LibVipService> findByVipIdAndSpeciesAndStat(String vipId, String species, int stat);

	List<LibVipService> findByVipIdAndSpecies(String vipId, String species);

	/**
	 * 推送会员相关服务信息至家长端
	 */
	void pushVipServiceInfo();

	/**
	 * 获取服务的结束时间（作业吧服务、通讯服务等）
	 *
	 * @param list   服务具体内容
	 * @param key
	 * @param format 日期格式化如：yyyy-MM-dd
	 * @return
	 */
	Map<String, Object> getServiceEndDate(List<LibVipService> list, String key, String format);

	/**
	 * 根据vipId查询服务吧过期时间
	 * @param vipId
	 * @return
	 */
	public String selectZybEndTimeByVipId(String vipId);
	
	/**
	 * 根据childUserId判断作业吧服务是否有效（未充值或过期），过期返回false
	 * @param childUserId
	 * @return
	 */
	public boolean checkZybExistOrExpiredByChildUserId(String childUserId);

	/**
	 * 查询最大结束时间的有效服务
	 *
	 * @param vipId
	 * @param species
	 * @return
	 */
	LibVipService findValidTopService(String vipId, String species);

	/**
	 * 查询最大结束时间的有效服务
	 * @param vipId
	 * @param species
	 * @param correctType
	 * @return
	 */
	LibVipService findValidTopService(String vipId, String species, int correctType);

	LibVipService findByLibIdAndVipIdAndSpecies(String libId, String vipId, String species);

	/**
	 * 查询最大结束时间的服务(包含有效和无效)
	 * @param vipId
	 * @param species
	 * @return
	 */
	LibVipService findTopByVipIdAndSpeciesOrderByEndTimeDesc(String vipId, String species);
	
	
	/**
	 * 分页查询馆下的所有的服务用户列表
	 * @param searchParams
	 * @param pageable
	 * @return
	 */
	Page<Map<String, Object>> findLibAllUserServiceList(Map<String, Object> searchParams, Pageable pageable);

	/**
	 * 查询过期的服务
	 * @param species 服务种类
	 */
    List<LibVipService> findExpiredListBySpecies(String species);

	/**
	 * 批量支付会员
	 *
	 * @param req
	 * @param clientIP 客户端请求ip（微信H5支付需要）
	 * @param accessToken
	 * @return
	 */
	ResponseEntity payVIPBatch(PayVipBatchReq req, String clientIP, String accessToken);

	/**
	 * 获取服务的所有记录
	 * @param vipId
	 * @return
	 */
	ResponseEntity getServiceRecords(String vipId);

	/**
	 * 获取服务的所有记录
	 * @param vipId
	 * @param appType 购买程序端(6:家长端小程序;7:老师端小程序（校长端和老师端);11:app老师端;12:app家长端)
	 * @return
	 */
	ResponseEntity getServiceRecords(String vipId, int appType);
	
	List<LibVipService> findVipIdServiceByLibId(String libId,String vipId ,String species);
	
	
	/**
	 * 查询出服务时间有相交的服务
	 * @param libId
	 * @param vipId
	 * @param species
	 * @return
	 */
	List<LibVipService> findVipIdServiceByIntersectTime(String vipId ,String species,Date startTime,Date endTime);
	
	/**
	 * 添加机构学生服务
	 * takeType=1 ：设置为立即生效
	 * takeType=2 ：设置为到期生效
	 * @param libId
	 * @param vipId
	 * @param species
	 * @return
	 */
	boolean insertVipIdServiceByAndTakeType(LibVipService libVipService,Integer takeType);

	/**
	 * 查找有效的服务
	 * @param vipId
	 * @param species
	 * @return
	 */
	List<LibVipService> findValidService(String vipId, String species);
	List<LibVipService> findValidService(String vipId, List<String> species);

	/**
	 * 查找馆下有效的服务
	 *
	 * @param vipId
	 * @param species
	 * @param libId
	 * @return
	 */
	List<LibVipService> findValidService(String vipId, String species, String libId);

	/**
	 * 将馆里所有服务对应添加或减去相应重叠天数
	 *
	 * @param newVacationLimit 新的节假日设置
	 * @param oldVacation 原本的节假日设置
	 */
	void setLibService(TbVacationLimit newVacationLimit,TbVacationLimit oldVacation) throws Exception;
	/**
	 * 计算服务开始时间和结束时间
	 * @param libVipService
	 * @param type
	 * @param num
	 * @param libId
	 * @param addDelayHolidayService 添加因节假日设置延长的服务记录
	 * @return
	 */
	Map<String, String> getInterVal(LibVipService libVipService, String type, int num, String libId, boolean addDelayHolidayService);
	/**
	 * 获取跳过节假日之后的结束时间
	 * @param beginTime
	 * @param endTime
	 * @param libId
	 * @param addDelayHolidayService
	 * @return
	 * @throws Exception
	 */
	Date getEndTimeSkipHoliday(Date beginTime, Date endTime, String libId, String vipId, boolean addDelayHolidayService,String vipServiceId) throws Exception;

	/**
	 * 获取小孩拥有的所有服务集合 学习系统服务类型(1平台服务（家长购买），2校区服务，4平台服务（机构购买），5校区服务(绑馆默认永久)，999内部用户)
	 * @param vipId
	 * @return
	 */
	List<LibVipService> getChildServiceList(String vipId);




	/**
	 * 学生列表获取服务
	 */
	LibVipService findCorrectTypeByVipId(String vipId);

    Page<Map<String, Object>> findForPage2(Map<String, Object> params, Pageable initPage);

	/**
	 * 清除服务相关缓存
	 *
	 * @param libId
	 * @param vipIdList
	 */
	void clearServiceCache(String libId, List<String> vipIdList);
	
    /**
     * 调用openApi
     * @param libId
     * @param num 降级后的服务数量
     */
    void openApiServiceCRM(Integer type,String libId,Integer signType,Integer mealType,Integer num,String startActiveTime,String computeTime,String endTime);
    
    public void insertLibServiceByType(String vipId, String libId, Date endDate, int signType);
    
    public void insertLibCorrectServiceByType(String vipId, String libId, Date endDate, int signType);

	void insertLibServiceV1(String vipId, String libId) throws Exception;

	void insertLibCorrectService(String vipId, String libId);
}
