package com.style24.persistence.domain;


import com.style24.core.support.session.TscSession;
import com.style24.core.support.util.CryptoUtils;
import com.style24.core.support.util.MaskingUtils;
import com.style24.persistence.TscBaseDomain;
import com.style24.persistence.TscPageRequest;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

/**
 * 회원 Domain
 *
 * @author jsshin
 * @since 2021. 01. 12
 */
@SuppressWarnings("serial")
@Data
public class Customer extends TscBaseDomain {

	private Integer custNo;				// 고객번호
	private String custId;				// 고객ID(탈퇴 시 "secede_cust"로 처리)
	private String custNm;				// 고객명_암호화
	private String encodedCustNm;		// 암호화된 고객명
	private String passwd;				// 비밀번호_암호화
	private String encodedPasswd;		// 암호화된 비밀번호
	private String orgPasswd;			// 기존비밀번호
	private String birthYmd;			// 생년월일(탈퇴 시 NULL로 처리)
	private String encodedBirthYmd; 	// 암호화된 생년월일
	private String birthSm;				// 양력/음력(S:양력,L:음력). 탈퇴 시 NULL로 처리
	private String sexGb;				// 성별구분(공통코드G007). 탈퇴 시 NULL로 처리
	private String encodedSexGb;		// 암호화된 성별구분
	private String cellPhnno;			// 휴대전화번호(탈퇴 시 NULL로 처리)
	private String encodedCellPhnno;	// 암호화된 휴대전화번호
	private String appAgreeYn;			// 앱푸쉬수신동의여부
	private String appAgreeDt;			// 앱푸쉬수신동의일시
	private String smsAgreeYn;			// SMS수신동의여부
	private String smsAgreeDt;			// SMS수신동의일시
	private String email;				// 이메일(탈퇴 시 NULL로 처리)
	private String encodedEmail;		// 암호화된 이메일
	private String emailAgreeYn;		// 이메일수신동의여부
	private String emailAgreeDt;		// 이메일수신동의일시
	private String mkAgreeYn;			// 마케팅수신동의여부
	private String mkAgreeDt;			// 마케팅수신동의일시
	private String homeZipcode;			// 자택우편번호(탈퇴 시 NULL로 처리)
	private String encodedHomeZipcode;	// 암호화된 자택우편번호
	private String homeBaseAddr;		// 자택기본주소(탈퇴 시 NULL로 처리)
	private String encodedHomeBaseAddr; // 암호화된 자택기본주소
	private String homeDtlAddr;			// 자택상세주소(탈퇴 시 NULL로 처리)
	private String encodedHomeDtlAddr;	// 암호화된 자택상세주소(탈퇴 시 NULL로 처리)
	private String siteCd;				// 가입사이트코드(공통코드G000)
	private String frontGb;				// 프론트구분(P:PC, M:모바일, A:앱)
	private String afLinkCd;			// 제휴링크코드
	private String custGb;				// 회원구분(공통코드G100)
	private String custGrade;			// 회원등급(공통코드G110)
	private String custGradeNm;			// 회원등급명
	private String joinDt;				// 가입일시
	private String foreignerYn;			// 외국인여부(외국인:Y)
	private String custStat;			// 고객상태(공통코드G104)
	private String passwdChgDt;			// 비밀번호변경일시
	private String tempPasswdYn;		// 임시비밀번호여부
	private String loginLdt;			// 최종로그인일시
	private String nvJoinId;			// 네이버가입ID
	private String nvAccessToken;		// 네이버접속토큰
	private String nvJoinDt;			// 네이버가입일시
	private String kkJoinId;			// 카카오가입ID
	private String kkAccessToken;		// 카카오접속토큰
	private String kkJoinDt;			// 카카오가입일시
	private String ysJoinId;			// YES24가입ID
	private String ysAccessToken;		// YES24접속토큰
	private String ysJoinDt;			// YES24가입일시
	private String ci;					// 인증CI
	private String authDt;				// 인증일시
	private String managedRsn;			// 관리대상지정사유(공통코드G120)
	private String managedDtlRsn;		// 관리대상지정상세사유
	private String managedDt;			// 관리대상지정일시
	private String secedeRsn;			// 탈퇴사유(공통코드G111)
	private String secedeDtlRsn;		// 탈퇴상세사유
	private String secedeDt;			// 탈퇴일시
	private String dormantDt;			// 휴면일시
	private String rmDormantDt;			// 휴면해제일시
	private String snsType;				// SNS 타입(NV:네이버, KK:카카오, YS:YES24)
	private String snsId;				// SNS 아이디
	private String memNo;				// YES24 가입시 사용
	private String callcenterTelNo;
	private String selfYn;
	
	// LMS
	private String content;			// 내용
	private String certNo;			// 인증번호
	private String mm;				// 월
	private String fewDt;
	private String title;

	// 나이스 인증
	private String encData;
	private String authMethod;		// 인증방법(고객정보, 휴대폰인증, 아이핀 인증)

	private int pwdChangeDay;		// 비밀번호 캠페인 화면 - ?일간 보지않기
	private int rejoinRejectDay;	// 탈퇴후재가입불가기간

	private String bankCd;			// 은행코드(공통코드G940)
	private String accountNo;		// 계좌번호
	private String accountNm;		// 예금주명

	private String emailModifyYn;
	private String marketingModifyYn;
	private String accountModifyYn;
	private String contactType;
	private String contactContents;

	private int diffLoginLdt;
	private int diffJoinDt;

	private String cpnNm;
	private String birthMm;
	private String encodedBirthMm;

	// 암호화 대상 복호화 처리
	public String getCustNm() {
		this.custNm = CryptoUtils.decryptAES(this.custNm);
		return this.custNm;
	}

	public String getSexGb() {
		this.sexGb = CryptoUtils.decryptAES(this.sexGb);
		return this.sexGb;
	}

	public String getEmail() {
		this.email = CryptoUtils.decryptAES(this.email);
		return this.email;
	}

	public String getBirthYmd() {
		this.birthYmd = CryptoUtils.decryptAES(this.birthYmd);
		return this.birthYmd;
	}

	public String getCellPhnno() {
		this.cellPhnno = CryptoUtils.decryptAES(this.cellPhnno);
		return this.cellPhnno;
	}

	public String getHomeZipcode() {
		this.homeZipcode = CryptoUtils.decryptAES(this.homeZipcode);
		return this.homeZipcode;
	}

	public String getHomeBaseAddr() {
		this.homeBaseAddr = CryptoUtils.decryptAES(this.homeBaseAddr);
		return this.homeBaseAddr;
	}

	public String getHomeDtlAddr() {
		this.homeDtlAddr = CryptoUtils.decryptAES(this.homeDtlAddr);
		return this.homeDtlAddr;
	}

	// Masking
	public String getMaskingCustId() {
		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.id(this.custId) : this.custId;
	}

	public String getMaskingCustNm() {
		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(getCustNm()) : getCustNm();

	}

	public String getMaskingCellPhnno() {
		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.phoneNo(getCellPhnno()) : getCellPhnno();
	}

	public String getMaskingEmail() {
		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.email(getEmail()) : getEmail();
	}


	// Pagination
	private TscPageRequest pageable;
	private int pageNo = 1;
	private int pageSize = 50;
	private int pageUnit = 10;

	// 암호화 대상 데이터 암호화 처리
	public void encryptData () {
		this.encodedCustNm = CryptoUtils.encryptAES(this.custNm);
		this.encodedSexGb = CryptoUtils.encryptAES(this.sexGb);
		this.encodedEmail = CryptoUtils.encryptAES(this.email);
		this.encodedCellPhnno = CryptoUtils.encryptAES(this.cellPhnno);
		this.encodedBirthYmd = CryptoUtils.encryptAES(this.birthYmd);
		this.encodedHomeZipcode = CryptoUtils.encryptAES(this.homeZipcode);
		this.encodedHomeBaseAddr = CryptoUtils.encryptAES(this.homeBaseAddr);
		this.encodedHomeDtlAddr = CryptoUtils.encryptAES(this.homeDtlAddr);
		this.encodedBirthMm = CryptoUtils.encryptAES(this.birthMm);
	}

	// 휴대폰 번호 대쉬 붙이기
	public void setHypenCellPhone() {
		if (StringUtils.isBlank(this.cellPhnno)) {
			return;
		}
		if (this.cellPhnno.length() > 10) {
			this.cellPhnno = this.cellPhnno.substring(0, 3) + "-" + this.cellPhnno.substring(3, 7) + "-" + this.cellPhnno.substring(7, 11);
		} else {
			this.cellPhnno = this.cellPhnno.substring(0, 3) + "-" + this.cellPhnno.substring(3, 6) + "-" + this.cellPhnno.substring(6, 10);
		}
	}

	// 생년월 초기화
	public void initBirthMm() {
		if (StringUtils.isBlank(this.birthYmd)) {
			return;
		}
		if (this.birthYmd.length() != 8) {
			return;
		}
		this.birthMm = this.birthYmd.substring(4, 6);
	}

}
