package com.fs.wx.ma.service;

import cn.binarywang.wx.miniapp.api.WxMaQrcodeService;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
import com.fs.wx.ma.config.WxMaConfiguration;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.stereotype.Service;

import java.io.File;

/**
 * 微信小程序二维码服务
 *
 * @author fs
 */
@Slf4j
@Service
public class WxMaQrcodeServiceImpl {

    /**
     * 获取小程序码（无限制）
     * 适用于需要的码数量极多的业务场景
     *
     * @param scene 最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~
     * @param page 必须是已经发布的小程序存在的页面，如果不填则默认跳转到主页
     * @param width 二维码的宽度，默认430
     * @param appid 小程序appid，如果为空则使用默认配置
     * @return 图片字节数组
     */
    public byte[] createWxaCodeUnlimit(String scene, String page, Integer width, String appid) throws WxErrorException {
        WxMaService wxMaService = getWxMaService(appid);
        WxMaQrcodeService qrcodeService = wxMaService.getQrcodeService();

        // 设置二维码线条颜色为黑色
        WxMaCodeLineColor lineColor = new WxMaCodeLineColor("0", "0", "0");

        if (width == null) {
            width = 430;
        }

        return qrcodeService.createWxaCodeUnlimitBytes(scene, page, false, WxMaConstants.DEFAULT_ENV_VERSION, width, false, lineColor, false);
    }


    /**
     * 获取小程序二维码（有限制，总数量限制为10万个）
     *
     * @param path 扫码进入的小程序页面路径，最大长度 128 字节，不能为空
     * @param width 二维码的宽度，默认430
     * @param appid 小程序appid，如果为空则使用默认配置
     * @return 图片字节数组
     */
    public byte[] createQrcode(String path, Integer width, String appid) throws WxErrorException {
        WxMaService wxMaService = getWxMaService(appid);
        WxMaQrcodeService qrcodeService = wxMaService.getQrcodeService();

        if (width == null) {
            width = 430;
        }

        return qrcodeService.createQrcodeBytes(path, width);
    }

    private WxMaService getWxMaService(String appid) {
        if (appid == null || appid.trim().isEmpty()) {
            return WxMaConfiguration.getMaService();
        }
        return WxMaConfiguration.getMaService(appid);
    }
}
