/**  
 * <p>Title: QyzxBusinessController.java</p>  
 * <p>Description: </p>  
 * @author dsc  
 * @date 2020年4月22日  
 * @version 1.0  
 */
package cn.timer.api.controller.qyzx;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.transaction.Transactional;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.timer.api.bean.qyzx.QyzxEntInfoM;
import cn.timer.api.bean.qyzx.businessService.QyzxBuyRecord;
import cn.timer.api.bean.qyzx.businessService.QyzxInvoiceData;
import cn.timer.api.bean.qyzx.businessService.QyzxOrderRecord;
import cn.timer.api.bean.qyzx.businessService.QyzxPayContent;
import cn.timer.api.bean.qyzx.businessService.QyzxRemainingQuantity;
import cn.timer.api.bean.qyzx.businessService.QyzxUseRecord;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

/**
 * <p>
 * Title: QyzxBusinessController.java
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author dsc
 * @date 2020年4月22日
 * @version 1.0
 */
@Transactional
@RestController
@Api(tags = "4.1企业中心(购买服务)")
@RequestMapping(value = "/qyzxbs", produces = { "application/json" })
public class QyzxBusinessController {

	@GetMapping(value = "/getAllQuantity")
	@ApiOperation(value = "获取全部套餐余量信息", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxRemainingQuantity>> s(@CurrentUser UserBean userBean) {
		List<QyzxRemainingQuantity> list = QyzxRemainingQuantity.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxRemainingQuantity>().eq(QyzxRemainingQuantity::getIsDelete, 0)
						.eq(QyzxRemainingQuantity::getOrgCode, userBean.getOrgCode()));
		return ResultUtil.data(list, "查询成功");
	}

	@GetMapping(value = "/getQuantity")
	@ApiOperation(value = "获取套餐余量信息(数量)", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<Map<String, Integer>>> getQuantity(@CurrentUser UserBean userBean) {
		List<QyzxRemainingQuantity> qyzxRemainingQuantitys1 = QyzxRemainingQuantity.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxRemainingQuantity>().eq(QyzxRemainingQuantity::getIsDelete, 0)
						.eq(QyzxRemainingQuantity::getOrgCode, userBean.getOrgCode())
						.eq(QyzxRemainingQuantity::getPmid, 1).select(QyzxRemainingQuantity::getRemainder));
		Integer sum1 = qyzxRemainingQuantitys1.stream()
				.collect(Collectors.summingInt(QyzxRemainingQuantity::getRemainder));

		List<QyzxRemainingQuantity> qyzxRemainingQuantitys2 = QyzxRemainingQuantity.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxRemainingQuantity>().eq(QyzxRemainingQuantity::getIsDelete, 0)
						.eq(QyzxRemainingQuantity::getOrgCode, userBean.getOrgCode())
						.eq(QyzxRemainingQuantity::getPmid, 2).select(QyzxRemainingQuantity::getRemainder));
		Integer sum2 = qyzxRemainingQuantitys2.stream()
				.collect(Collectors.summingInt(QyzxRemainingQuantity::getRemainder));

		Map<String, Integer> map1 = new HashMap<String, Integer>();
		map1.put("message", sum1);

		Map<String, Integer> map2 = new HashMap<String, Integer>();
		map2.put("contract", sum2);

		List<Map<String, Integer>> list = new ArrayList<Map<String, Integer>>();
		list.add(map1);
		list.add(map2);
		return ResultUtil.data(list, "获取成功");
	}

	@GetMapping(value = "/getQuantity/System")
	@ApiOperation(value = "获取系统剩余天数、版本", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> getSystemQuantity(@CurrentUser UserBean userBean) {
		QyzxEntInfoM qyzxEntInfoM = QyzxEntInfoM.builder().build()
				.selectOne(new LambdaQueryWrapper<QyzxEntInfoM>().eq(QyzxEntInfoM::getId, userBean.getOrgCode()));
		Date endTime = qyzxEntInfoM.getEndTime();
		Long day = DateUtil.between(new Date(), endTime, DateUnit.DAY,false);
		Integer level = qyzxEntInfoM.getLevel();

		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("betweenDay", day);

		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("level", level);

		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		list.add(map1);
		list.add(map2);
		return ResultUtil.data(list, "获取成功");

	}

	@GetMapping(value = "/getPayList/Contract")
	@ApiOperation(value = "获取短信商品列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxPayContent>> getPayListwithContract(@CurrentUser UserBean userBean) {
		List<QyzxPayContent> list = QyzxPayContent.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxPayContent>().eq(QyzxPayContent::getPmid, 1).select(
						QyzxPayContent::getId, QyzxPayContent::getContent, QyzxPayContent::getNowPrice,
						QyzxPayContent::getOriginalPrice, QyzxPayContent::getSpecification,
						QyzxPayContent::getExpiration));
		return ResultUtil.data(list, "获取成功");
	}

	@GetMapping(value = "/getPayList/Msg")
	@ApiOperation(value = "获取电子合同商品列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxPayContent>> getPayListWithMsg(@CurrentUser UserBean userBean) {
		List<QyzxPayContent> list = QyzxPayContent.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxPayContent>().eq(QyzxPayContent::getPmid, 2).select(
						QyzxPayContent::getId, QyzxPayContent::getContent, QyzxPayContent::getNowPrice,
						QyzxPayContent::getOriginalPrice, QyzxPayContent::getSpecification,
						QyzxPayContent::getExpiration));
		return ResultUtil.data(list, "获取成功");
	}

	@GetMapping(value = "/getPayList/System")
	@ApiOperation(value = "获取系统续费商品列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxPayContent>> getPayListWithSystem(@CurrentUser UserBean userBean) {
		List<QyzxPayContent> list = QyzxPayContent.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxPayContent>().eq(QyzxPayContent::getPmid, 3).select(
						QyzxPayContent::getId, QyzxPayContent::getContent, QyzxPayContent::getNowPrice,
						QyzxPayContent::getOriginalPrice, QyzxPayContent::getSpecification,
						QyzxPayContent::getExpiration));
		return ResultUtil.data(list, "获取成功");
	}

	@PostMapping(value = "/generateOrder")
	@ApiOperation(value = "生成购买订单", httpMethod = "POST", notes = "接口发布说明")
	public Result<QyzxOrderRecord> generateOrder(@CurrentUser UserBean userBean,
			@RequestBody QyzxOrderRecord qyzxOrderRecord) {
		Integer orgCode = userBean.getOrgCode();
		String orderNo = String.valueOf(System.currentTimeMillis()) + orgCode; // 时间毫秒数+orgCode

		qyzxOrderRecord.setCreateUser(userBean.getEmpNum()); // 创建人
		qyzxOrderRecord.setOrgCode(orgCode);
		qyzxOrderRecord.setOrderNo(orderNo); // 订单号
		qyzxOrderRecord.setOrderStatus(0); // 订单状态-无

		Integer pmid = qyzxOrderRecord.getPmid(); // 商品id
		Integer pcid = qyzxOrderRecord.getPcid(); // 商品id
		QyzxPayContent qyzxPayContent = QyzxPayContent.builder().build();
		QyzxPayContent qyzxPayContent2 = qyzxPayContent.selectOne(Wrappers.lambdaQuery(qyzxPayContent)
				.eq(QyzxPayContent::getId, pcid).eq(QyzxPayContent::getPmid, pmid).select(QyzxPayContent::getContent,
						QyzxPayContent::getSpecification, QyzxPayContent::getUnit, QyzxPayContent::getExpiration,
						QyzxPayContent::getOriginalPrice, QyzxPayContent::getNowPrice));
		if (qyzxPayContent2 == null) {
			return ResultUtil.error("商品不存在");
		}
		JSONObject json = JSONUtil.parseObj(qyzxPayContent2);
		qyzxOrderRecord.setOrderDetail(json.toString()); // 订单商品详情-json字符串
		qyzxOrderRecord.insert();

		// 请求第三方接口生成预支付交易,返回二维码链接code_url TODO

		// 生成二维码 TODO

		return ResultUtil.data(qyzxOrderRecord, "生成订单成功");

	}

	@GetMapping(value = "/queryBuyRecord")
	@ApiOperation(value = "查询购买记录", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxBuyRecord>> queryBuyRecord(@CurrentUser UserBean userBean,
			@RequestParam(defaultValue = "1", required = false) Integer pageNum,
			@RequestParam(defaultValue = "10", required = false) Integer pageSize,
			@RequestParam(required = false) String query, @RequestParam(required = false) String s,
			@RequestParam(required = false) String e) {
		QueryWrapper<QyzxBuyRecord> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("org_code", userBean.getOrgCode()).and(query != null && query != "",
				wq -> wq.like("order_no", query).or().like("content", query));
		queryWrapper.between(s != null && s != "" && e != null && e != "", "create_time",
				!StrUtil.hasBlank(s) ? s : "1000-01-01 00:00:00", !StrUtil.hasBlank(e) ? e : "9999-01-01 00:00:00");
		Page<Object> page = PageHelper.startPage(pageNum, pageSize);
		List<QyzxBuyRecord> list = QyzxBuyRecord.builder().build().selectList(queryWrapper);
		return ResultUtil.pageData(list, page.getTotal(), "查询成功");
	}

	@PostMapping(value = "/invoicing")
	@ApiOperation(value = "开发票", httpMethod = "POST", notes = "接口发布说明")
	public Result<QyzxInvoiceData> generateOrder(@CurrentUser UserBean userBean,
			@RequestBody QyzxInvoiceData qyzxInvoiceData) {
		String orderNo = qyzxInvoiceData.getOrderNo();
		QyzxBuyRecord qyzxBuyRecord = QyzxBuyRecord.builder().build()
				.selectOne(new LambdaQueryWrapper<QyzxBuyRecord>().eq(QyzxBuyRecord::getOrderNo, orderNo));
		if (qyzxBuyRecord.getInvoiceStatus() != 0) {
			return ResultUtil.error("开票失败,请检查发票状态");
		}
		qyzxInvoiceData.setCreateUser(userBean.getEmpNum());
		qyzxInvoiceData.setOrgCode(userBean.getOrgCode());
		qyzxInvoiceData.insert();

		qyzxBuyRecord.setInvoiceStatus(1);
		qyzxBuyRecord.update(new LambdaUpdateWrapper<QyzxBuyRecord>().eq(QyzxBuyRecord::getOrderNo, orderNo));
		return ResultUtil.data(qyzxInvoiceData, "开票成功");
	}

	@GetMapping(value = "/queryInvoiceDetail")
	@ApiOperation(value = "查询开票详情", httpMethod = "GET", notes = "接口发布说明")
	public Result<QyzxInvoiceData> queryInvoiceDetail(@CurrentUser UserBean userBean, @RequestParam String orderNo) {
		return ResultUtil.data(QyzxInvoiceData.builder().build()
				.selectOne(new LambdaQueryWrapper<QyzxInvoiceData>().eq(QyzxInvoiceData::getOrderNo, orderNo)), "查询成功");
	}

	@GetMapping(value = "/queryMsgRecord")
	@ApiOperation(value = "查询短信套餐余量", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxRemainingQuantity>> queryMsgRecord(@CurrentUser UserBean userBean) {
		List<QyzxRemainingQuantity> list = QyzxRemainingQuantity.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxRemainingQuantity>().ne(QyzxRemainingQuantity::getIsDelete, 1)
						.eq(QyzxRemainingQuantity::getOrgCode, userBean.getOrgCode())
						.eq(QyzxRemainingQuantity::getPmid, 1));
		return ResultUtil.data(list, "查询成功");
	}

	@GetMapping(value = "/queryContractRecord")
	@ApiOperation(value = "查询电子合同套餐余量", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxRemainingQuantity>> queryContractRecord(@CurrentUser UserBean userBean) {
		List<QyzxRemainingQuantity> list = QyzxRemainingQuantity.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxRemainingQuantity>().ne(QyzxRemainingQuantity::getIsDelete, 1)
						.eq(QyzxRemainingQuantity::getOrgCode, userBean.getOrgCode())
						.eq(QyzxRemainingQuantity::getPmid, 2));
		return ResultUtil.data(list, "查询成功");
	}

	@GetMapping(value = "/queryMsgUseRecord")
	@ApiOperation(value = "查询短信使用记录", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<QyzxUseRecord>> queryMsgUseRecord(@CurrentUser UserBean userBean, String orderNo) {
		return ResultUtil.data(QyzxUseRecord.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxUseRecord>().eq(QyzxUseRecord::getOrderNo, orderNo)), "查询成功");
	}

	// TODO 不同业务使用 不同数据表

	@GetMapping(value = "/queryContractUseRecord")
	@ApiOperation(value = "查询电子合同套餐使用记录", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> queryContractUseRecord(@CurrentUser UserBean userBean) {
		return null;
	}

}