package com.bb.util;

import com.bb.model.OTPInfo;
import com.warrenstrange.googleauth.GoogleAuthenticator;
import com.warrenstrange.googleauth.GoogleAuthenticatorKey;
import com.warrenstrange.googleauth.GoogleAuthenticatorQRGenerator;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TOTPTokenGenerator {
	
	private static String GOOGLE_URL = "https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=";
	
	private TOTPTokenGenerator() {
        //throw new RuntimeException("TOTPTokenUtil");
    }
    
    /**
	 * OTP 정보 URL 생성
	 * @param secretKey - generateSecretKey 메서드 리턴 값
	 * @param issuer - OTP 발급자(사이트 도메인)
	 * @param userName - OTP 발급하는 사용자 이름
	 * @return Google Authenticator에 전달할 정보 URL
	 * @throws Exception
	 */
    //QR-Code 생성 [개인키, 계정명(유저ID), 발급자(회사명)을 받아서 구글OTP 인증용 링크를 생성하는 메소드]
    public static OTPInfo getGoogleAuthQRUrl(OTPInfo info) {
    	try {
    		GoogleAuthenticator googleAuthenticator = new GoogleAuthenticator();
            GoogleAuthenticatorKey googleAuthenticatorKey = googleAuthenticator.createCredentials();
            
            // 실제론 생성한 key를 DB에 저장해놔야 나중에 OTP를 검증할 수 있음
            String secretKey = googleAuthenticatorKey.getKey();
            info.setSecretKey(secretKey);
            log.info("#-QR_OTP::secretKey : " + secretKey);

            String QRUrl = GoogleAuthenticatorQRGenerator.getOtpAuthURL(info.getIssuer(), info.getAccount(), googleAuthenticatorKey);
            info.setUrl(QRUrl);
            log.info("#-QR_OTP::URL : " + QRUrl);
            log.info("#-QR_OTP::info : " + info);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    	return info;
    }
    
    public static boolean otpVerify(String secret, int code) {
    	boolean verify = false;
    	GoogleAuthenticator googleAuthenticator = new GoogleAuthenticator();
    	verify = googleAuthenticator.authorize(secret, code);
    	log.info("#-QR_OTP::Verify : {}", verify);
    	
    	return verify;
    }
}
