package com.zanxiang.game.back.serve.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zanxiang.erp.security.annotation.PreAuthorize;
import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameOrderDTO;
import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameUserDTO;
import com.zanxiang.game.back.serve.pojo.dto.OrderReportDTO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameOrderVO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameUserVO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniOrderSplitLogVO;
import com.zanxiang.game.back.serve.service.*;
import com.zanxiang.module.util.DateUtil;
import com.zanxiang.module.util.exception.BaseException;
import com.zanxiang.module.util.pojo.ResultVO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;

@RestController
@RequestMapping("/tencentMiniGame")
public class TencentMiniGameLogController {

    @Autowired
    private IGameTencentMiniGameUserService gameTencentMiniGameUserService;

    @Autowired
    private IGameTencentMiniGameOrderService gameTencentMiniGameOrderService;

    @Autowired
    private IGameTencentMiniGameOrderSplitLogService gameTencentMiniGameOrderSplitLogService;

    @Autowired
    private IGameTencentMiniGameCallbackService gameTencentMiniGameCallbackService;

    @Autowired
    private IGameTencentMiniGameRoleRegisterService gameTencentMiniGameRoleRegisterService;

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderLogs")
    @PostMapping("/orderLogs")
    public ResultVO<IPage<GameTencentMiniGameOrderVO>> tencentOrderLogList(@RequestBody GameTencentMiniGameOrderDTO dto) {
        return ResultVO.ok(gameTencentMiniGameOrderService.listOfPage(dto));
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderLogs")
    @GetMapping("/orderSplitList/{orderId}")
    public ResultVO<List<GameTencentMiniOrderSplitLogVO>> orderSplitList(@PathVariable("orderId") String orderId) {
        return ResultVO.ok(gameTencentMiniGameOrderSplitLogService.listByOrderNo(Collections.singletonList(orderId)));
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderReport")
    @PostMapping("/orderReport/{ids}/{backMoney}")
    public ResultVO<Boolean> tencentOrderReport(@PathVariable("ids") List<Long> ids, @PathVariable("backMoney") BigDecimal backMoney) {
        OrderReportDTO dto = new OrderReportDTO();
        dto.setOrderIds(ids);
        dto.setSplitOrder(false);
        dto.setBackMoney(backMoney);
        return tencentOrderReport(dto);
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderReport")
    @PostMapping("/orderReport")
    public ResultVO<Boolean> tencentOrderReport(@Validated @RequestBody OrderReportDTO dto) {
        if (CollectionUtils.isEmpty(dto.getOrderIds())) {
            throw new BaseException("参数错误！");
        }
        if (dto.getSplitOrder()) {
            if (CollectionUtils.isEmpty(dto.getSplitMoney())) {
                throw new BaseException("回传金额错误！");
            }
            dto.getSplitMoney().forEach(backMoney -> {
                if (backMoney.compareTo(BigDecimal.ZERO) <= 0) {
                    throw new BaseException("回传金额错误！");
                }
            });
            if (dto.getBetweenMinuteMin() == null || dto.getBetweenMinuteMax() == null
                    || dto.getBetweenMinuteMin() < 1 || dto.getBetweenMinuteMax() < 1
                    || dto.getBetweenMinuteMin().compareTo(dto.getBetweenMinuteMax()) >= 0) {
                throw new BaseException("回传间隔时间错误！");
            }
        } else {
            if (dto.getBackMoney().compareTo(BigDecimal.ZERO) <= 0) {
                throw new BaseException("回传金额错误！");
            }
        }
        return ResultVO.ok(gameTencentMiniGameOrderService.doReport(dto));
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:userLogs")
    @PostMapping("/userLogs")
    public ResultVO<IPage<GameTencentMiniGameUserVO>> tencentUserLogList(@RequestBody GameTencentMiniGameUserDTO dto) {
        return ResultVO.ok(gameTencentMiniGameUserService.listOfPage(dto));
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:userReport")
    @PostMapping("/userReport/{ids}")
    public ResultVO<Boolean> tencentUserReport(@PathVariable("ids") List<Long> ids) {
        return ResultVO.ok(gameTencentMiniGameUserService.doReport(ids));
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:roleReport")
    @PostMapping("/roleReport/{ids}")
    public ResultVO<Boolean> tencentRoleReport(@PathVariable("ids") List<Long> ids) {
        return ResultVO.ok(gameTencentMiniGameRoleRegisterService.doReport(ids));
    }

    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:userUpdateCallBackUrl")
    @GetMapping("/user/update/back/url")
    public ResultVO<Boolean> userUpdateCallBackUrl(@RequestParam Long gameId, @RequestParam long startTime) {
        gameTencentMiniGameCallbackService.delayUpdateMiniGameUserCallBackUrl(gameId, DateUtil.secondToLocalDateTime(startTime));
        return ResultVO.ok();
    }

}
