/**  
 * <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 org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.StringUtils;
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.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.timer.api.bean.dzht.DzhtSignflowFinish;
import cn.timer.api.bean.qyzx.QyzxEntInfoM;
import cn.timer.api.bean.qyzx.QyzxSms;
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>> getAllQuantity(@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<Map<String, Object>> getPayListWithSystem(@CurrentUser UserBean userBean) {
		List<QyzxPayContent> list1 = QyzxPayContent.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxPayContent>().eq(QyzxPayContent::getPmid, 3)
						.eq(QyzxPayContent::getSpecification, 1).select(QyzxPayContent::getId,
								QyzxPayContent::getNowPrice, QyzxPayContent::getOriginalPrice,
								QyzxPayContent::getExpiration));
		List<QyzxPayContent> list2 = QyzxPayContent.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxPayContent>().eq(QyzxPayContent::getPmid, 3)
						.eq(QyzxPayContent::getSpecification, 2).select(QyzxPayContent::getId,
								QyzxPayContent::getNowPrice, QyzxPayContent::getOriginalPrice,
								QyzxPayContent::getExpiration));

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("simple", list1);
		map.put("professional", list2);
		return ResultUtil.data(map, "获取成功");
	}

	@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.lambda().ge(StringUtils.isNotBlank(s), QyzxBuyRecord::getCreateTime, s)
				.le(StringUtils.isNotBlank(e), QyzxBuyRecord::getCreateTime, e);
		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) {

		Double invoiceValue = qyzxInvoiceData.getInvoiceValue();
		if (invoiceValue <= 0)
			return ResultUtil.error("请填写正确的发票金额!");

		if (!ObjectUtil.isAllNotEmpty(
//				qyzxInvoiceData, 
				qyzxInvoiceData.getInvoiceTitle(), qyzxInvoiceData.getDutyParagraph(),
				qyzxInvoiceData.getCompanyAddress(), qyzxInvoiceData.getCompanyPhone(), qyzxInvoiceData.getBankName(),
				qyzxInvoiceData.getBankAccount(), qyzxInvoiceData.getInvoiceType(), qyzxInvoiceData.getInvoiceProject(),
				invoiceValue, qyzxInvoiceData.getConsignee(), qyzxInvoiceData.getConsigneePhone(),
				qyzxInvoiceData.getEmail(), qyzxInvoiceData.getShippingArea(), qyzxInvoiceData.getShippingAddress(),
				qyzxInvoiceData.getZipCode())) {
			return ResultUtil.error("请完善发票信息!");
		}

		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,
			@RequestParam(required = false) String orderNo, @RequestParam(required = false) String startTime,
			@RequestParam(required = false) String endTime, @RequestParam(defaultValue = "1") int pageNum,
			@RequestParam(defaultValue = "10") int pageSize) {
		Page<Object> page = PageHelper.startPage(pageNum, pageSize);
		List<QyzxUseRecord> list = QyzxUseRecord.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxUseRecord>().eq(QyzxUseRecord::getOrgCode, userBean.getOrgCode())
						.eq(QyzxUseRecord::getPmid, 1)
						.eq(StringUtils.isNotBlank(orderNo), QyzxUseRecord::getOrderNo, orderNo)
						.ge(StringUtils.isNotBlank(startTime), QyzxUseRecord::getCreateTime, startTime)
						.le(StringUtils.isNotBlank(endTime), QyzxUseRecord::getCreateTime, endTime)
						.last("order by create_time desc"));
		return ResultUtil.pageData(list, page.getTotal(), "查询成功");
	}

	@GetMapping(value = "/queryMsgUseDetal/{id}")
	@ApiOperation(value = "查询短信使用详情", httpMethod = "GET", notes = "接口发布说明")
	public Result<QyzxSms> queryMsgUseDetal(@CurrentUser UserBean userBean, @PathVariable Integer id) {
		return ResultUtil.data(
				QyzxSms.builder().build().selectOne(new LambdaQueryWrapper<QyzxSms>().eq(QyzxSms::getUseId, id)),
				"查询成功");
	}

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

	@GetMapping(value = "/queryContractUseRecord")
	@ApiOperation(value = "查询电子合同套餐使用记录", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> queryContractUseRecord(@CurrentUser UserBean userBean, String orderNo) {
		return ResultUtil.data(QyzxUseRecord.builder().build()
				.selectList(new LambdaQueryWrapper<QyzxUseRecord>().eq(QyzxUseRecord::getOrgCode, userBean.getOrgCode())
						.eq(QyzxUseRecord::getPmid, 2).eq(orderNo != null, QyzxUseRecord::getOrderNo, orderNo)),
				"查询成功");
	}

	@GetMapping(value = "/queryContractUseDetail")
	@ApiOperation(value = "查询电子合同使用详情(流程结束后)", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> queryContractUseDetail(@CurrentUser UserBean userBean, String flowId) {
		return ResultUtil.data(DzhtSignflowFinish.builder().build().selectOne(
				new LambdaQueryWrapper<DzhtSignflowFinish>().eq(flowId != null, DzhtSignflowFinish::getFlowId, flowId)),
				"查询成功");
	}

}