package cn.ysk.cashier.mybatis.rest;

import cn.hutool.core.io.IoUtil;
import cn.hutool.http.HttpUtil;
import cn.ysk.cashier.annotation.Log;
import cn.ysk.cashier.domain.QiniuContent;
import cn.ysk.cashier.exception.BadRequestException;
import cn.ysk.cashier.mybatis.entity.Activate;
import cn.ysk.cashier.mybatis.service.ShopService;
import cn.ysk.cashier.service.QiNiuService;
import cn.ysk.cashier.utils.CacheKey;
import cn.ysk.cashier.utils.RedisUtils;
import cn.ysk.cashier.utils.SecurityUtils;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.io.InputStream;
import java.util.Map;

@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "/shop/storage")
@RequestMapping("/shop/storage")
public class StorageController {
    @Autowired
    private ShopService shopService;
    private final RedisUtils redisUtils;

    private final QiNiuService qiNiuService;
    private static final String APP_ID = "wxd88fffa983758a30";
    private static final String APP_SECRET = "a34a61adc0602118b49400baa8812454";
    private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
    private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode";

    @GetMapping("/findActivate")
    public ResponseEntity<Object> findActivate(@RequestParam String shopId){
        String userName  = SecurityUtils.getCurrentUsername();
        return new ResponseEntity<>(shopService.findActivate(shopId), HttpStatus.OK);
    }

    @Log("修改活动数据")
    @PostMapping("/modityActivate")
    public ResponseEntity<Object> modityActivate(@RequestBody Activate activate){
        if (activate.getIsGiftPro() != null && activate.getIsGiftPro() == 1 && CollectionUtils.isEmpty(activate.getProducts()))
            throw new BadRequestException("赠送商品不可为空");
        String userName  = SecurityUtils.getCurrentUsername();
        shopService.modityActivate(activate);
        return new ResponseEntity<>(HttpStatus.OK);
    }

    @GetMapping("/activate/{activateId}")
    @ApiOperation("查询活动赠送商品")
    public ResponseEntity<Object> queryActivatePros(@PathVariable("activateId") Integer activateId){
        return new ResponseEntity<>(shopService.findActivatePros(activateId),HttpStatus.OK);
    }

    /**
     * @param params
     *      shopId 必填
     *      env_version 存在即生成体验版
     * @return
     */
    @PostMapping("/getwxacode")
    public ResponseEntity<Object> getwxacode(@RequestBody Map<String, Object> params) {
        if (CollectionUtils.isEmpty(params) || !params.containsKey("shopId")) throw new BadRequestException("参数错误");
        if (redisUtils.hasKey(CacheKey.VIPCODE + params.get("shopId"))) return new ResponseEntity<>(redisUtils.get(CacheKey.VIPCODE + params.get("shopId")),HttpStatus.OK);
        try {
            InputStream qrCodeStream = fetchQRCode(params);
            QiniuContent qiniuContent = qiNiuService.uploadByte(IoUtil.readBytes(qrCodeStream),qiNiuService.findCloud());
            redisUtils.set(CacheKey.VIPCODE + params.get("shopId"),qiniuContent.getUrl());
            return new ResponseEntity<>(qiniuContent.getUrl(),HttpStatus.OK);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("Failed to generate QR code: " + e.getMessage());
        }
    }

    private String getAccessToken() {
        String url = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", TOKEN_URL, APP_ID, APP_SECRET);
        String response = HttpUtil.get(url);
        JSONObject jsonResponse = JSONObject.parseObject(response);
        if (!jsonResponse.containsKey("access_token")) {
            throw new RuntimeException("Failed to retrieve access token: " + response);
        }
        return jsonResponse.getString("access_token");
    }
    private InputStream fetchQRCode(Map<String, Object> params) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("path", "pages/member/index?shopId="+params.get("shopId"));//路径
        jsonObject.addProperty("is_hyaline", true);//是否需要透明底色，为 true 时，生成透明底色的小程序码
        if (params.containsKey("env_version")) jsonObject.addProperty("env_version", "trial");//正式版为 release，体验版为 trial，开发版为 develop
        String accessToken = getAccessToken();
        String url = String.format("%s?access_token=%s", QR_CODE_URL, accessToken);
        return HttpUtil.createPost(url)
                .body(jsonObject.toString(), "application/json")
                .execute()
                .bodyStream();
    }
}
