package com.hzs.third.pay.service.impl;

import cn.hutool.core.net.URLEncoder;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.hzs.common.core.constant.Constants;
import com.hzs.common.core.domain.R;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.core.utils.StringUtils;
import com.hzs.common.domain.third.pay.TOnlinePayment;
import com.hzs.third.pay.config.SandPayConfig;
import com.hzs.third.pay.constants.PayRedisConstants;
import com.hzs.third.pay.constants.SandPayConstants;
import com.hzs.third.pay.service.ISandPayService;
import com.hzs.third.pay.util.PayUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;

/**
 * 杉德支付服务
 */
@Slf4j
@Service
public class SandPayServiceImpl implements ISandPayService {

    @Autowired
    private SandPayConfig sandPayConfig;
    @Autowired
    private RedisTemplate redisTemplate;

//    /**
//     * 扫码支付（微信、支付宝）
//     *
//     * @param onlinePayment
//     * @return
//     */
//    @Override
//    public R<String> scanPay(TOnlinePayment onlinePayment) {
//        try {
//            // 杉德付款码缓存KEY
//            String scanKey = String.format(PayRedisConstants.SAND_SCAN_KEY, onlinePayment.getBusinessType(), onlinePayment.getBusinessCode(), onlinePayment.getPayType());
//            if (redisTemplate.hasKey(scanKey)) {
//                Object payInfo = redisTemplate.opsForValue().get(scanKey);
//                if (null != payInfo) {
//                    return R.ok(payInfo.toString());
//                }
//            }
//
//            // 统一请求参数
//            TreeMap<String, String> params = new TreeMap<>();
//            params.put("app_id", sandPayConfig.getAppId());
//            params.put("method", SandPayConstants.METHOD_SCAN);
//            params.put("sign_type", SandPayConstants.SIGN_TYPE);
//            params.put("timestamp", DateUtils.parseDateTimeToStr(DateUtils.YAMMERERS, new Date()));
//            params.put("nonce", System.currentTimeMillis() + "");
//
//            // 业务参数
//            JSONObject bizContent = new JSONObject();
//            bizContent.putOpt("create_ip", InetAddress.getLocalHost().getHostAddress());
//            bizContent.putOpt("total_amount", onlinePayment.getPayMoney().doubleValue());
//            bizContent.putOpt("out_order_no", onlinePayment.getBusinessCode());
//            bizContent.putOpt("body", "支付：" + onlinePayment.getBusinessCode());
//            bizContent.putOpt("store_id", sandPayConfig.getStoreId());
//            bizContent.putOpt("notify_url", sandPayConfig.getCallbackUrl());
//            bizContent.putOpt("redirect_url", sandPayConfig.getFrontUrl());
//            bizContent.putOpt("req_reserved", onlinePayment.getBusinessType());
//            params.put("biz_content", bizContent.toString());
//
//            // 签名
//            params.put("sign", AlipaySignature.rsaSign(params, sandPayConfig.getPrivateKey(), Constants.UTF8));
//
//            log.info("杉德扫码请求数据：{}", params);
//
//            String postResult = HttpUtil.post(sandPayConfig.getRequestUrl(), JSONUtil.toJsonStr(params));
//
//            log.info("杉德扫码返回数据： {}", postResult);
//
//            if (StringUtils.isNotEmpty(postResult)) {
//                HashMap<String, String> resultMap = JSONUtil.toBean(postResult, HashMap.class);
//                if (SandPayConstants.SUCCESS_CODE.equals(resultMap.get("code"))) {
//                    // 返回正常
//                    HashMap<String, String> dataMap = JSONUtil.toBean(resultMap.get("data"), HashMap.class);
//                    if (SandPayConstants.SUCCESS.equals(dataMap.get("sub_code"))) {
//                        // 返回业务正常
//                        String qrCode = dataMap.get("qr_code");
//
//                        // 付款码redis保存24小时
//                        redisTemplate.opsForValue().set(scanKey, qrCode, 24, TimeUnit.HOURS);
//
//                        return R.ok(qrCode);
//                    } else {
//                        log.error("调用杉德支付返回业务失败! {}", dataMap.get("sub_msg"));
//                    }
//                }
//            } else {
//                log.info("调用杉德支付返回失败");
//            }
//        } catch (Exception e) {
//            log.error("杉德扫码支付异常", e);
//        }
//        return R.fail("杉德扫码支付失败");
//    }
//
//
//    @Override
//    public R<String> weChatH5(TOnlinePayment onlinePayment) {
//        try {
//            // 与三方对接，需要扩展支付订单号，用于标记业务
//            String thirdOrderCode = PayUtil.getThirdOrderCode(onlinePayment.getBusinessCode(), onlinePayment.getBusinessType());
//            onlinePayment.setOriginalOrder(thirdOrderCode);
//
//            TreeMap<String, String> params = new TreeMap<>();
//            params.put("version", "10");
//            params.put("mer_no", sandPayConfig.getAppId());
//            params.put("mer_order_no", thirdOrderCode);
//            params.put("create_time", DateUtils.parseDateTimeToStr(DateUtils.YAMMERERS, new Date()));
//            params.put("order_amt", onlinePayment.getPayMoney().doubleValue() + "");
//            params.put("notify_url", sandPayConfig.getCallbackUrl());
//            params.put("return_url", sandPayConfig.getFrontUrl());
//            params.put("create_ip", InetAddress.getLocalHost().getHostAddress().replaceAll("\\.", "_"));
//            params.put("store_id", sandPayConfig.getStoreId());
//            Map<String, String> extraMap = new HashMap<>();
//            extraMap.put("mer_app_id", "");
//            extraMap.put("openid", "");
//            extraMap.put("buyer_id", "");
//            extraMap.put("wx_app_id", sandPayConfig.getWeChatAppId());
//            extraMap.put("gh_ori_id", sandPayConfig.getWeChatGhId());
//            extraMap.put("path_url", "");
//            // 正式版:0; 开发版:1; 体验版:2
//            extraMap.put("miniProgramType", "0");
//            params.put("pay_extra", JSONUtil.toJsonStr(extraMap));
//            params.put("sign_type", SandPayConstants.SIGN_TYPE);
//            // 小程序云静态网站ur
//            params.put("gh_static_url", "https://cloud1-8gp1n6uofa17e2e2-1315820965.tcloudbaseapp.com/jump_mp.html");
//
//            URLEncoder urlEncoder = new URLEncoder();
//            // 签名
//            params.put("sign", urlEncoder.encode(AlipaySignature.rsaSign(params, sandPayConfig.getPrivateKey(), Constants.UTF8), StandardCharsets.UTF_8));
//
//            params.put("expire_time", DateUtils.parseDateTimeToStr(DateUtils.YAMMERERS, DateUtils.addDays(new Date(), 1)));
//            // 微信小程序(云函数h5)
//            params.put("product_code", "01010006");
//            // 0-T1(默认); 1-T0; 2-D0; 3-D1
//            params.put("clear_cycle", "0");
//            params.put("jump_scheme", "hemacash://hmpay");
//            params.put("goods_name", urlEncoder.encode("支付:" + onlinePayment.getBusinessCode(), StandardCharsets.UTF_8));
//            params.put("notify_url", urlEncoder.encode(sandPayConfig.getCallbackUrl(), StandardCharsets.UTF_8));
//            params.put("return_url", urlEncoder.encode(sandPayConfig.getFrontUrl(), StandardCharsets.UTF_8));
//            params.put("pay_extra", urlEncoder.encode(JSONUtil.toJsonStr(extraMap), StandardCharsets.UTF_8));
//            // 终端/网站参数（已经不用，需要传入默认）
//            params.put("meta_option", urlEncoder.encode("[{\"s\":\"Android\",\"n\":\"\",\"id\":\"\",\"sc\":\"\"},{\"s\":\"IOS\",\"n\":\"\",\"id\":\"\",\"sc\":\"\"}]", StandardCharsets.UTF_8));
//
//            // 最终请求参数
//            String requestParam = AlipaySignature.getSignContent(params);
//
//            String getUrl = "https://cash.sandgate.cn/h5/?" + requestParam + "#/applet";
//
//            log.info("杉德微信H5调用数据： {}", getUrl);
//
//            return R.ok(getUrl);
//        } catch (Exception e) {
//            log.error("调用杉德微信H5返回异常!", e);
//        }
//        return R.fail("杉德支付失败，请刷新后重试");
//    }
//
//    @Override
//    public R<String> aliH5(TOnlinePayment onlinePayment) {
//        try {
//            // 与三方对接，需要扩展支付订单号，用于标记业务
//            String thirdOrderCode = PayUtil.getThirdOrderCode(onlinePayment.getBusinessCode(), onlinePayment.getBusinessType());
//            onlinePayment.setOriginalOrder(thirdOrderCode);
//
//            TreeMap<String, String> params = new TreeMap<>();
//            params.put("version", "10");
//            params.put("mer_no", sandPayConfig.getAppId());
//            params.put("mer_order_no", thirdOrderCode);
//            params.put("create_time", DateUtils.parseDateTimeToStr(DateUtils.YAMMERERS, new Date()));
//            params.put("order_amt", onlinePayment.getBusinessMoney().doubleValue() + "");
//            params.put("notify_url", sandPayConfig.getCallbackUrl());
//            params.put("return_url", sandPayConfig.getFrontUrl());
//            params.put("create_ip", InetAddress.getLocalHost().getHostAddress().replaceAll("\\.", "_"));
//            params.put("store_id", sandPayConfig.getStoreId());
//            Map<String, String> extraMap = new HashMap<>();
//            extraMap.put("mer_app_id", "");
//            extraMap.put("openid", "");
//            extraMap.put("buyer_id", "");
//            extraMap.put("wx_app_id", "");
//            extraMap.put("gh_ori_id", "");
//            extraMap.put("path_url", "");
//            extraMap.put("miniProgramType", "");
//            params.put("pay_extra", JSONUtil.toJsonStr(extraMap));
//            params.put("sign_type", SandPayConstants.SIGN_TYPE);
//
//            URLEncoder urlEncoder = new URLEncoder();
//            // 签名
//            params.put("sign", urlEncoder.encode(AlipaySignature.rsaSign(params, sandPayConfig.getPrivateKey(), Constants.UTF8), StandardCharsets.UTF_8));
//
//            params.put("expire_time", DateUtils.parseDateTimeToStr(DateUtils.YAMMERERS, DateUtils.addDays(new Date(), 1)));
//            // 支付宝生活号(支付宝H5)
//            params.put("product_code", "01020002");
//            // 0-T1(默认); 1-T0; 2-D0; 3-D1
//            params.put("clear_cycle", "0");
//            params.put("jump_scheme", "hemacash://hmpay");
//            params.put("goods_name", urlEncoder.encode("支付:" + onlinePayment.getBusinessCode(), StandardCharsets.UTF_8));
//            params.put("notify_url", urlEncoder.encode(sandPayConfig.getCallbackUrl(), StandardCharsets.UTF_8));
//            params.put("return_url", urlEncoder.encode(sandPayConfig.getFrontUrl(), StandardCharsets.UTF_8));
//            params.put("pay_extra", urlEncoder.encode(JSONUtil.toJsonStr(extraMap), StandardCharsets.UTF_8));
//            // 终端/网站参数（已经不用，需要传入默认）
//            params.put("meta_option", urlEncoder.encode("[{\"s\":\"Android\",\"n\":\"\",\"id\":\"\",\"sc\":\"\"},{\"s\":\"IOS\",\"n\":\"\",\"id\":\"\",\"sc\":\"\"}]", StandardCharsets.UTF_8));
//
//            // 最终请求参数
//            String requestParam = AlipaySignature.getSignContent(params);
//
//            String getUrl = "https://cash.sandgate.cn/h5/?" + requestParam + "#/hippoH5";
//
//            log.info("杉德支付宝H5调用数据： {}", getUrl);
//
//            return R.ok(getUrl);
//        } catch (Exception e) {
//            log.error("调用杉德支付宝H5返回异常!", e);
//        }
//        return R.fail("杉德支付失败，请刷新后重试");
//    }



}
