package com.dbs.mplus.fatima.framework.util;

import android.util.Base64;

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

/**
 * Hash 처리 유틸
 * Created by aple on 2016. 4. 20..
 */
public class MPlusHashUtil {


    /**
     * SHA-256 hash
     * @param salt
     * @param data
     * @return
     * @throws Exception
     */
    public static String sha256(String salt, byte[] data) throws Exception {
        if(data == null) {
            throw new Exception("Hash를 적용할 데이터가 없음");
        }

        try{
            final MessageDigest digest = MessageDigest.getInstance("SHA-256");
            // 초기화
            digest.reset();
            if(salt != null) {
                salt = salt.trim();
                if(!"".equals(salt)) {
                    digest.update(salt.getBytes());
                }
            }

            // 데이터의 hash값 구하기
            final byte[] hash = digest.digest(data);
            final StringBuilder hexString = new StringBuilder();

            for (final byte element : hash) {
                final String hex = Integer.toHexString(0xff & element);
                if(hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }

            return hexString.toString();
        }
        catch(final Exception ex){
            throw new Exception("SHA-256적용 실패", ex);
        }

    }

    /**
     * 결제에서 MD5를 적용해야 해서 생성된 메소드
     * MD5는 사용이 금지되었으나 어쩔 수 없음
     * @param strData
     * @return
     */
    public static String paymentHash(String strData) {
        String hexStr = "";

        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.reset();
            //byte[] bytData = strData.getBytes();
            //md.update(bytData);
            md.update(strData.getBytes());

            // hash 적용된 바이트 끌어와서
            byte[] digest = md.digest();

            // 16진수로 만들어 주기
            StringBuilder builder = new StringBuilder();
            String hx = null;

            for (int i = 0; i < digest.length; i++){
                hx =  Integer.toHexString(0xFF & digest[i]);
                //0x03 is equal to 0x3, but we need 0x03 for our md5sum
                if(hx.length() == 1) {
                    hx = "0" + hx;
                }
                builder.append(hx);

            }

            // 16진수 문자열 뽑아내고
            hexStr = builder.toString();
            byte[] raw = hexStr.getBytes();
            byte[] encodedBytes = Base64.encode(raw, 0);
            hexStr = new String(encodedBytes);
            //hexStr = new String(raw);
        }
        catch (NoSuchAlgorithmException e) {
            MPlusLogUtil.ERROR(MPlusHashUtil.class, "Hash알고리즘이 없음", e);
        }

        return hexStr;
    }
}
