package com.jsowell.common.util;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.text.DecimalFormat;
import java.util.Base64;

/**
 * 汇付支付的工具类
 */
@Slf4j
public class AdapayUtil {

	/**
	 * 格式化数字  保留两位小数，不足补0
	 * @param amount
	 * @return
	 */
	public static String formatAmount(String amount) {
		return formatAmount(new BigDecimal(amount));
	}

	/**
	 * 格式化数字  保留两位小数，不足补0
	 * @param amount
	 * @return
	 */
	public static String formatAmount(BigDecimal amount) {
		return formatAmount(amount, 2);
	}

	/**
	 * 格式化数字  保留n位小数，不足补0
	 * @param amount
	 * @return
	 */
	public static String formatAmount(BigDecimal amount, int n) {
		//保留n位小数 没有四舍五入
		double d = amount.setScale(n, RoundingMode.DOWN).doubleValue();
		//不足则补0
		StringBuilder pattern = new StringBuilder("0");
		for (int i = 0; i < n; i++) {
			if (i == 0) {
				pattern.append(".");
			}
			pattern.append("0");
		}
		DecimalFormat decimalFormat = new DecimalFormat(pattern.toString());
		return decimalFormat.format(d);
	}

	public static void main(String[] args) {
		BigDecimal bigDecimal = new BigDecimal("1236.8369");
		System.out.println(formatAmount(bigDecimal, 0));
		System.out.println(formatAmount(bigDecimal, 2));
		System.out.println(formatAmount(bigDecimal, 4));
	}

	/**
	 * RSA私钥签名：签名方式SHA256WithRSA
	 * @param data 待签名字符串
	 * @param privateKeyBase64 私钥（Base64编码）
	 * @return 签名byte[]
	 * @throws Exception
	 */
	public static String sign(String data, String privateKeyBase64) {
		// Base64 --> Key
		try {
			byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
			PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
			KeyFactory keyFactory;
			keyFactory = KeyFactory.getInstance("RSA");
			PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
			// Sign
			Signature signature = Signature.getInstance("SHA256WithRSA");
			signature.initSign(privateKey);
			signature.update(data.getBytes(StandardCharsets.UTF_8));
			return Base64.getEncoder().encodeToString(signature.sign());
		} catch (Exception e) {
			log.error("sign Exception", e);
			return null;
		}
	}

	/**
	 * 使用汇付RSA公钥验签
	 * @param data 待签名字符串
	 * @param publicKeyBase64 公钥（Base64编码）
	 * @return 验签结果
	 * @throws Exception
	 */
	public static boolean verify(String data, String publicKeyBase64, String sign) {
		// Base64 --> Key
		try {
			byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
			X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
			KeyFactory keyFactory;
			keyFactory = KeyFactory.getInstance("RSA");
			PublicKey publicKey = keyFactory.generatePublic(keySpec);
			// verify
			Signature signature = Signature.getInstance("SHA256WithRSA");
			signature.initVerify(publicKey);
			signature.update(data.getBytes(StandardCharsets.UTF_8));
			return signature.verify(Base64.getDecoder().decode(sign));
		} catch (Exception e) {
			log.error("verify Exception", e);
			return false;
		}
	}

}
