package com.takensoft.common.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Base64.Encoder;
import java.util.Base64.Decoder;

/**
 * @author  : takensoft
 * @since   : 2025.01.22
 * @modification
 *     since    |    author    | description
 *  2025.01.22  |  takensoft   | 최초 등록
 *
 * 암호화 및 복호화 작업을 수행하는 유틸리티
 */
@Component
public class Secret {

    private static final Charset UTF_8 = StandardCharsets.UTF_8; // UTF-8 문자셋

    private static String SECRET_KEY; // 암호화 키

    private static String VECTOR_KEY; // 복호화 키
    /**
     * @param secret - 암호화 키 (application.yml에서 값을 읽어 옴)
     * @param vector - 복호화 키 (application.yml에서 값을 읽어 옴)
     *
     * 기본 생성자
     */
    public Secret(@Value("${crypto.secret}")String secret, @Value("${crypto.vector}")String vector) {
        this.SECRET_KEY = secret;
        this.VECTOR_KEY = vector;
    }

    /**
     * @param data - 암호화할 데이터
     * @return 암호화된 데이터 (Base64로 인코딩된 문자열)
     *
     * 암호화
     */
    public static String encrypt(String data) {
        Encoder encoder = Base64.getEncoder();
        byte[] message = data.getBytes(UTF_8);
        byte[] encryptedData = KISA_SEED_CBC.SEED_CBC_Encrypt(SECRET_KEY.getBytes(), VECTOR_KEY.getBytes(), message, 0, message.length);
        return new String(encoder.encode(encryptedData), UTF_8);
    }

    /**
     * @param encryptedData - 복호화할 암호화된 데이터 (Base64로 인코딩된 문자열)
     * @return 복호화된 원본 데이터
     *
     * 복호화
     */
    public static String decrypt(String encryptedData) {
        Decoder decoder = Base64.getDecoder();
        byte[] message = decoder.decode(encryptedData);
        byte[] decryptedData = KISA_SEED_CBC.SEED_CBC_Decrypt(SECRET_KEY.getBytes(), VECTOR_KEY.getBytes(), message, 0, message.length);
        return new String(decryptedData, UTF_8);
    }
}