package com.style24.persistence.domain;

import java.time.Clock;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;
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;

/**
 * 쿠폰 도메인
 * @author xyzp1539
 * @since 2020-12-21
 */
@SuppressWarnings("serial")
@Data
public class Coupon extends TscBaseDomain {

    // TB_COUPON
    private Integer cpnId;					// 쿠폰ID
    private String cpnNm;					// 쿠폰명
    private String siteCd;					// 사이트코드(공통코드G000)
    private String afLinkCd;				// 제휴링크코드
    private String usableCustGb;			// 사용가능고객구분(공통코드G100)
    private String usableCustGrade;		    // 사용가능고객등급(공통코드G110)
    private String cpnType;				    // 쿠폰유형(공통코드G230)
    private String cpnTarget;               // 쿠폰대상(공통코드G260)
    private String applyScope;				// 적용범위(A:전체, I:개별). "I:개별"이고 쿠폰유형이 "20:장바구니쿠폰" 외 이면 TB_COUPON_REFVAL 참조
    private String dcWay;					// 할인방식(공통코드G240)
    private int    dcPval;					// 할인값(PC). 할인방식이 금액이면 할인금액, 율이면 할인율
    private int    dcMval;					// 할인값(모바일). 할인방식이 금액이면 할인금액, 율이면 할인율
    private int    dcAval;					// 할인값(모바일앱)
    private int    maxDcAmt;				// 최고할인금액
    private String pdGb;					// 기간/일수구분(P:기간, D:일수)
    private String availStdt;				// 유효시작일시(기간/일수구분 "P:기간"일 때 사용됨)
    private String availEddt;				// 유효종료일시(기간/일수구분 "P:기간"일 때 사용됨)
    private String availStdtTime;			// 유효시작일시(시분초까지)
    private String availEddtTime;			// 유효종료일시(시분초까지)
    private int    availDays;				// 유효일수(기간/일수구분 "D:일수"일 때 사용됨)
    private int    custPubLimitQty;		    // 고객당발행제한수량(0은 무제한)
    private int    totPubLimitQty;			// 총발행제한수량(0은 무제한)
    private int    onePubQty;				// 1회발행수량(기본은 1)
    private String dnGb;					// 다운로드구분(공통코드G058)
    private String downStdt;				// 다운로드시작일시
    private String downEddt;			    // 다운로드종료일시
    private int    buyLimitAmt;			    // 구매제한금액(0은 제한없음. 그 외는 00 이상 구매 시 사용)
    private int    planSq;					// 기획전번호(쿠폰유형이 플러스쿠폰 일 때 사용 기획전번호)
    private String reissuance;				// 쿠폰재발급여부(공통코드G231)
    private String cpnStat;				    // 쿠폰상태(공통코드G232)
    private String endAlimYn;				// 만료알림여부
    private String firstOrdYn;				// 첫구매여부 (Y:구매이력이없음 | N:구매이력있음)
    private String downAblYn;				// 다운로드가능여부(마이페이지, 상품상세) --> EP쿠폰, 난수쿠폰
    private String custJoinStdt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
    private String custJoinEddt;			// 회원가입일자(FROM) 20200101 (신규회원여부의 판단을 가입일자로 설정함)
    private String buyStdt;				    // 회원가입일자(FROM) 20200101 (구매기간일자(FROM) (해당기간에 구매이력이 없으면 다운로드 가능))
    private String buyEddt;				    // 구매기간일자(TO)
    private int    issueCnt;				// 쿠폰발급개수
    private int    useCnt;					// 쿠폰사용개수
    private String payType;                 // 결제수단
    private String newCustYn;              // 신규회원여부
    private String afChannel;               // 제휴링크
    private String dcCdGb;                  // 할인코드유형 (공통코드G233)
    private String rdCpnNm;                 // 랜덤쿠폰 사용키 (시리얼명 or 난수)
    private String chkExcep;                // 종료제외여부

    private int custNo;
    private String custNm;
    private String custGbNm;
	private String cellPhnno;	// 휴대전화번호(탈퇴 시 NULL로 처리)
    private String custGradeNm;
    private String useYn;
    private String usedDt;
    private String pubReason;
    private String pubReasonNm;
    private String pubReasonDtl;
    private String refVal;
    private String secondRefVal;
    private String useCondition;
    private String issueCondition;
    private String expireYn;
    private int cpnCnt;
    private String tgtCondition;
    private String quickYn;
    
    private int custCouponCnt;		// 고객이 쿠폰 다운로드수
    private int totCouponCnt;		// 전체 쿠폰 다운로드수
    private int pointUnit;
    private int refBrandCnt;
    private int refSupplyCompCnt;
    private int refGoodsCnt;
    private int refCateCnt;
    private String refBrandNm;
    private String refSupplyCompNm;
    private String refGoodsNm;
    private String refCateNm;
    private String goodsCd;

    private Integer limitCpnId;         // 선착순쿠폰일련번호
    private String delYn;
    private String cpnDesc;             // 쿠폰설명
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private int[] cartSqArr;		// 장바구니 일련번호 배열
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private int[] currPrices;		// 상품가격 배열
    private String custGb;			// 회원구분
    private String custGrade;		// 회원등급
    private int rdCpnId;			// 랜덤쿠폰번호
    private int dcAmt;				// 할인적용금액
    private int dcVal;				// 할인금액/율
    private String result;			// 결과
    private String frontGb;			// 화면 구분
    private String availYn;			// 지급 받은 쿠폰 사용 가능 유무
    private int downloadCnt;		// 다운로드수

    private String userYn;				// 쿠폰 사용할 수 있는지 여부
    private int cnt;					// 같은 쿠폰 묶은 수량
    private int allCouponCnt;			// 현재 쿠폰 보유 수
    private int useCouponCnt;			// 현재 사용할 수 있는 보유 수 
    private int expireCouponCnt;		// 7일 뒤 만료 쿠폰 수
    private int ownCoupon;				
    private String couponStat;			// 쿠폰 다운받았는지 여부
    private String title;				//기획전 에서 설정한 쿠폰 타이틀
    private String cpnNote0;			//기획전 에서 설정한 쿠폰 유의사항 0~9
	private String cpnNote1;
	private String cpnNote2;
	private String cpnNote3;
	private String cpnNote4;
	private String cpnNote5;
	private String cpnNote6;
	private String cpnNote7;
	private String cpnNote8;
	private String cpnNote9;
    
    private String planCouponStat;
    // 그리드 파라미터
    List<CouponRefval> supplyCompList;          // 공급업체 리스트
    List<CouponRefval> brandList;               // 브랜드 리스트
    List<CouponRefval> applyGoodsList;          // 적용상품 리스트
    List<CouponRefval> exceptGoodsList;         // 제외상품 리스트
    List<CouponRefval> cateList;                // 카테고리 리스트
    List<CouponBurden> burdenList;              // 업체 분담율 리스트

    // TB_COUPON_BAN_GOODS
    private int    cpnBanGoodsSq;           //  제외상품시퀀스

    // 사용가능고객구분
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private String[] usableCustGbArr;

    // 사용가능고객등급
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private String[] usableCustGradeArr;

    // 결제수단
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private String[] payTypeArr;

    List<CouponLimitedTime> limitedTimeCpnList; //선착순 쿠폰 리스트
    List<CouponAfChannel> afChannelList; //쿠폰 제휴채널 리스트

    private String scmYn;

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

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

    public String getMaskingCustNm() {
        return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(getCustNm()) : getCustNm();
    }
    
    // 업체목록배열
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private String[] supplyCompCdArr;
    
    // 브랜드목록배열
    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private String[] brandCdArr;
    
    private String brandCd;
    private String brandEnm;
    private String supplyCompNm;
    private String supplyCompCd;
    private String brandGroupNm;
}
