package com.eactive.httpmockserver.common.util;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author
 * @version 1.0
 * @Class Name : EncryptionUtil.java
 * @Description : 문자열 암호화 처리하는 유틸리티 클래스
 * @since 2009.08.26
 */
@Component
public class EncryptionUtil {

    private static final String SHA_256 = "SHA-256";
    MessageDigest md;

    public EncryptionUtil() throws NoSuchAlgorithmException {
        md = MessageDigest.getInstance(SHA_256);
    }

    public String generateNewPassword() {
        // 2. 임시 비밀번호를 생성한다.(영+영+숫+영+영+숫+영+영=8자리)
        StringBuilder newpassword = new StringBuilder();
        for (int i = 1; i <= 8; i++) {
            // 영자
            if (i % 3 != 0) {
                newpassword.append(RandomUtil.getRandomStr('a', 'z'));
                // 숫자
            } else {
                newpassword.append(RandomUtil.getRandomNum(0, 9));
            }
        }
        return newpassword.toString();
    }

    /**
     * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용)
     *
     * @param password 암호화될 패스워드
     * @param id       salt로 사용될 사용자 ID 지정
     * @return 암호화된 패스워드
     */
    public synchronized String encryptPassword(String password, String id) {
        if (StringUtils.isEmpty(password)) return "";
        if (StringUtils.isEmpty(id)) return "";

        byte[] hashValue = null; // 해쉬값

        md.reset();
        md.update(id.getBytes());
        hashValue = md.digest(password.getBytes());

        return new String(Base64.encodeBase64(hashValue));
    }

}
