package com.example.his.api.mis.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.example.his.api.common.result.R;
import com.example.his.api.exception.HisException;
import com.example.his.api.mis.service.OrderService;
import com.example.his.api.req.MisOrder.CheckPaymentResultForm;
import com.example.his.api.req.MisOrder.SearchOrderByPageForm;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

@RestController("MisOrderController")
@RequestMapping("/mis/order")
public class OrderController {
    @Resource
    private OrderService orderService;

    /**
     * 查询订单记录
     * @param form
     * @return
     */
    @PostMapping("/searchMisOrderByPage")
    @SaCheckPermission(value = {"BUSINESS:ORDER","BUSINESS:ORDER:SELECT"}, mode = SaMode.OR)
    public R searchMisOrderByPage(@Valid @RequestBody SearchOrderByPageForm form) {
        if ((form.getStartDate() != null && form.getEndDate() == null) || (form.getStartDate() == null && form.getEndDate() != null)) {
            throw new HisException("startDate和endDate不允许一个为空，另一个不为空");
        }
        //验证日期先后逻辑
        else if (form.getStartDate() != null && form.getEndDate() != null) {
            DateTime startDate = DateUtil.parse(form.getStartDate());
            DateTime endDate = DateUtil.parse(form.getEndDate());
            if (endDate.isBefore(startDate)) {
                throw new HisException("endDate不能早于startDate");
            }
        }
        Map param = BeanUtil.beanToMap(form);
        PageInfo<HashMap> list = orderService.searchMisOrderByPage(param);

        return R.success(list);
    }

    /**
     * 同步付款结果
     * @param form
     * @return
     */
    @PostMapping("/checkPaymentResult")
    public R checkPaymentResult(@Valid @RequestBody CheckPaymentResultForm form) {
        ArrayList<String> list = form.getOutTradeNoArray();
        AtomicInteger rows = orderService.checkPaymentResult(list);
        return R.success(rows);
    }

    /**
     * 删除已关闭的订单
     */
    @GetMapping("/deleteOrderById")
    public R deleteOrderById(@RequestParam Integer id) {
        int rows =  orderService.deleteOrderById(id);
        return R.success(rows);
    }

    /**
     * 线下退款
     */
    @GetMapping("/onlineRefund")
    public R onlineRefund(@RequestParam String outTradeNo) {
        int rows =  orderService.updateOnlineRefundStatus(outTradeNo);
        return R.success(rows);
    }
}
