package com.sv.service.api;

import com.github.pagehelper.PageHelper;
import com.sv.entity.MemberLessonTicket;
import com.sv.entity.VenueLesson;
import com.sv.entity.VenueLessonTicket;
import com.sv.mapper.VenueLessonTicketMapper;
import com.ydd.framework.core.common.Pagination;
import com.ydd.framework.core.entity.enums.StatusEnum;
import com.ydd.framework.core.exception.ServiceException;
import com.ydd.framework.core.service.impl.BaseServiceImpl;
import org.apache.commons.lang3.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * Service - 场馆课程票号
 *
 * @author lihong
 * @since 2018-08-06
 */
@Service("VenueLessonTicketServiceApi")
@Transactional
public class VenueLessonTicketService extends BaseServiceImpl {

	private final Logger logger = LoggerFactory.getLogger(VenueLessonTicketService.class);

	@Resource
	private VenueLessonTicketMapper venueLessonTicketMapper;

	/**
	 * 创建场馆课程票号
	 *
	 * @param venueLessonTicket 场馆课程票号
	 */
	@Transactional
    public void save(VenueLessonTicket venueLessonTicket) {
		if (venueLessonTicket.getId() != null && venueLessonTicket.getId() > 0) {
			// 更新
			venueLessonTicketMapper.update(venueLessonTicket);
		} else {
			// 新建
			venueLessonTicketMapper.insert(venueLessonTicket);
		}
	}

	/**
	 * 更新场馆课程票号
 	 *
	 * @param venueLessonTicket 场馆课程票号
	 */
	@Transactional
    public void update(VenueLessonTicket venueLessonTicket) {
		venueLessonTicketMapper.update(venueLessonTicket);
	}

	/**
	 * 删除场馆课程票号
	 *
	 * @param id 编号
   	 * @return 删除数量
	 */
	@Transactional
    public Integer delete(Integer id) {
		if (id == null || id <= 0) {
			return 0;
		}
		return venueLessonTicketMapper.delete(id);
	}

	/**
	 * 删除场馆课程票号
	 *
	 * @param ids 编号数组
	 * @return 删除数量
	 */
	@Transactional
    public Integer deleteByIds(Integer[] ids) {
		if (ids == null || ids.length == 0) {
			return 0;
		}
		return venueLessonTicketMapper.deleteByIds(ids);
	}

	/**
	 * 查询场馆课程票号
	 *
	 * @param id 编号
	 * @return 场馆课程票号
	 */
	public VenueLessonTicket findById(Integer id) {
		return venueLessonTicketMapper.findById(id);
	}

	/**
	 * 查询场馆课程票号
	 *
	 * @param pagination 分页信息
	 * @return 分页结果
	 */
	public Pagination findPage(Pagination pagination) {
		PageHelper.startPage(pagination.getPage(), pagination.getPageSize());
		PageHelper.orderBy("id desc");
		pagination.setQueryResult(venueLessonTicketMapper.findAll());
		return pagination;
	}

	/**
	 * 更新状态
	 *
	 * @param ids 编号
	 * @param status 状态
	 * @return 更新数量
	 */
	@Transactional
	public Integer updateStatus(Integer[] ids, Byte status) {
		if (ids == null) {
			return 0;
		}
		if (status == null) {
			status = StatusEnum.DISABLE.value;
		}

		return venueLessonTicketMapper.updateStatus(ids, status);
	}

	/**
	 * api 预约课程，查询场馆课程票号总条数
	 */
	public Integer findCount(Integer lessonId){
		return venueLessonTicketMapper.findCount(lessonId);
	}

	/**
	 * api 修改场馆课程票号状态为已购买
	 */
	@Transactional
	public Integer updateLessonTicketStatus(List<VenueLessonTicket> tickets){
		 return venueLessonTicketMapper.updateLessonTicketStatus(tickets,1);
	}

	/**
	 * api随机取票
	 */
	public List<VenueLessonTicket> findRandom(Integer lessonId, Integer limitSum, Integer i){
		return  venueLessonTicketMapper.findRandom(lessonId,limitSum);
	}

	/**
	 * api 预约课程，修改	‘场馆课程票号’
	 * 查询场馆课程票号，根据预约人数，查询，并修改状态为已购买,并且判断返回的update条数，判断预约是否成功
	 */
	@Transactional
	public List<VenueLessonTicket> updateLessonTicketOrder(Integer count, VenueLesson venueLesson, Integer num){
		//随机获取课程票据，并分配
		Integer i = RandomUtils.nextInt(1, count + 1);
		// 取票据
		List<VenueLessonTicket> tickets = venueLessonTicketMapper.findRandom(venueLesson.getId(),num);
		if (tickets.size() == 0){
			throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.LESSON_TICKET_ERROR);
		}
		// 修改场馆课程票号状态为已购买
		Integer lessonTicketCount = updateLessonTicketStatus(tickets);
		if (lessonTicketCount.intValue() < tickets.size()){
			throw new ServiceException(com.sv.exception.api.ExceptionCodeTemplate.LESSON_TICKET_ERROR);
		}
		return tickets;
	}

	/**
	 * api 修改取消对应课程的票据为未购买
	 */
	@Transactional
	public void updateTicketStatus(List<MemberLessonTicket> memberLessonTickets){
		venueLessonTicketMapper.updateTicketStatus(memberLessonTickets,0);
	}

	public Integer findNum(Integer lessonId){
		return venueLessonTicketMapper.findNum(lessonId);
	}
}

