package com.eactive.eai.util;

import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

//TOUSE
//kbank 어댑터에서 업무데이터의 암호화 필드에 대한 암복호화
//OAuth2.0 의 ClientID를 통해 등록된 key를 조회하여 사용
public class CryptoUtil {
	public static final String defaultCharset = "utf-8";
	private CryptoUtil() {

	}

	public static String encryptAES(String key, String text) {
		return encrypt(key, text, "AES");
	}

	public static String decryptAES(String key, String base64EncodedText) {
		return decrypt(key, base64EncodedText, "AES");
	}

	public static String encrypt(String key, String text, String algoritm) throws IllegalArgumentException {
		try {
			SecretKeySpec secureKey = new SecretKeySpec(key.getBytes(), algoritm);
			Cipher cipher = Cipher.getInstance(algoritm);
			cipher.init(Cipher.ENCRYPT_MODE, secureKey);
			byte[] encryptData = cipher.doFinal(text.getBytes(defaultCharset));
			return new String(Base64.getEncoder().encode(encryptData));
		} catch (Exception e) {
			throw new IllegalArgumentException(e.toString());
		}
	}

	public static String decrypt(String key, String text, String algoritm) throws IllegalArgumentException {
		try {
			SecretKeySpec secureKey = new SecretKeySpec(key.getBytes(), algoritm);
			byte[] encryptedData = Base64.getDecoder().decode(text.getBytes(defaultCharset));
			Cipher cipher = Cipher.getInstance(algoritm);
			cipher.init(Cipher.DECRYPT_MODE, secureKey);
			byte[] plainText = cipher.doFinal(encryptedData);
			return new String(plainText);
		} catch (Exception e) {
			throw new IllegalArgumentException(e.toString());
		}
	}

	public static void main(String[] args) {
	        String key = "ONAuROzlqWB4VuBwO5C/FA==";
	        String text = "Hello AES 한글";

	        // System.out.println("Original Text: " + text);

	        long startEncryptTime = System.nanoTime();
	        String enc = encryptAES(key, text);
	        long endEncryptTime = System.nanoTime();
	        long encryptDuration = endEncryptTime - startEncryptTime;
	        // System.out.println("Encrypted Text: " + enc);
	        // System.out.println("Encryption took: " + encryptDuration + " nanoseconds");

	        long startDecryptTime = System.nanoTime();
	        String dec = decryptAES(key, enc);
	        long endDecryptTime = System.nanoTime();
	        long decryptDuration = endDecryptTime - startDecryptTime;
	        // System.out.println("Decrypted Text: " + dec);
	        // System.out.println("Decryption took: " + decryptDuration + " nanoseconds");
	}
}