package kr.co.uplus.ez.common.utils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;

import lguplus.security.data.USecurityModule;
import lguplus.security.json.simple.parser.ParseException;
import lguplus.security.vulner.SetPolicyFile;

public class USecuritySupUtils {
	
	private static final String RULE_NM = "UplusMR";
	private static final String RULE_FILE_NAME = "UplusMaskingRule";
	private static final String RULE_FILE_SUFFIX = "json";

	/**
	 * 마스킹룰 JSON 파일 위치를 재지정 하기 위한 기능
	 * USecuritySupUtils.initMaskingRule()
	 */
	public static void initMaskingRule() {
		try {
			ClassPathResource resource = new ClassPathResource(RULE_FILE_NAME + "." + RULE_FILE_SUFFIX);
			InputStream inputStream = resource.getInputStream();
			File tmpFile = File.createTempFile(RULE_FILE_NAME, RULE_FILE_SUFFIX);
			FileUtils.copyInputStreamToFile(inputStream, tmpFile);
			SetPolicyFile.setRuleFile(RULE_NM, tmpFile.getPath());
		} catch (IOException | ParseException e) {
			e.printStackTrace();
		}
    }

	/**
	 * 카드정보
	 * 
	 * 앞3자리, 뒤4자리 남긴 후 마스킹
	 * 단, 7자리 이하는 앞 3자리 남기고 마스킹
 	 * 3자리 이하는 모두 마스킹
 	 * ex) 123*-****-****-1234
 	 * USecuritySupUtils.maskingCardnum("1234-1234-1234-1234")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingCardnum(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "cardnum", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 전화번호
	 * 
	 * 국번 3자리 혹은 4자리 마스킹
	 * 단, 8자리 이하는 뒤 4자리 남기고 마스킹
	 * 4자리 이하는 모두 마스킹
	 * ex) 02-****-1234 / 010-****-1234
	 * USecuritySupUtils.maskingPhone("02-1234-1234")
	 * USecuritySupUtils.maskingPhone("010-1234-1234")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingPhone(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "phone", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 시리얼번호
	 * 
	 * 뒤 4자리 외 마스킹
	 * 단, 4자리 이하는 모두 마스킹
	 * ex) ***4567
	 * USecuritySupUtils.maskingSerial("12345678")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingSerial(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "serial", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 계좌번호
	 * 
	 * 앞 3자리, 뒤 4자리 남긴 후 마스킹
	 * 단, 7자리 이하는 앞 3자리 남기고 마스킹
	 * 3자리 이하는 모두 마스킹
	 * ex) 123-***-**3456
	 * USecuritySupUtils.maskingAccountnum("123-123-123456")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingAccountnum(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "accountnum", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * IP
	 * 
	 * ipv4: Dot 기준으로 3번째 블록 마스킹
	 * ex) 123.123.***.123
	 * USecuritySupUtils.maskingIp("123.123.123.123")
	 * ipv6: Colon 기준으로 마지막 블록 마스킹
	 * ex) 2001:0DB8:0:0:0:0:1428:****
	 * USecuritySupUtils.maskingIp("2001:0DB8:0:0:0:0:1428:1234")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingIp(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "ip", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 이름
	 * 
	 * 성 뒤 이름의 첫자리 마스킹
	 * ex) 홍*동, 허*설헌
	 * USecuritySupUtils.maskingName("홍길동")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingName(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "name", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 주민번호
	 * 
	 * 뒤 6자리 마스킹
	 * ex) 800101-1******
	 * USecuritySupUtils.maskingJumin("800101-1234567")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingJumin(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "jumin", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 이메일주소
	 * 
	 * 계정 앞 3자리 외 마스킹
	 * 단, 3자리 이하는 계정 모두 마스킹
	 * ex) abc*****@hanmail.net
	 * USecuritySupUtils.maskingEmail("abcdefg@hanmail.net")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingEmail(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "email", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}
	
	/**
	 * 주소
	 * 
	 * 도로명 뒤 마스킹(단 병기되는 동은 표시가능) 읍,면,동,리 이후 마스킹 또는 상세주소 제외
	 * 단, 마스킹 대상이 없을 경우 (주소입력오류)
	 * 1) 1차로 숫자만 마스킹
	 * 2) 숫자도 없을 경우 뒤에서 3자리 마스킹
	 * ex) 서울시 마포구 월드컵북로 ***
	 * ex) 서울 영등포구 여의도동 **-*
	 * USecuritySupUtils.maskingAddress("서울시 마포구 월드컵북로 200-1")
	 * 
	 * @param value
	 * @return
	 */
	public static String maskingAddress(String value) {
		String v = "";
		if (StringUtils.hasText(value)) {
			try {
				v = USecurityModule.maskingApply(RULE_NM, "address", value);
			} catch (IOException | ParseException e) {
				e.printStackTrace();
			}	
		}
		return v;
	}

}
