package com.style24.persistence.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.style24.core.support.util.CryptoUtils;
import com.style24.persistence.TscBaseDomain;
import com.style24.persistence.TscPageRequest;
import lombok.Data;

import java.util.List;

@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 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 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 String supplyCompCd;
    private String mdNo;

    private int custNo;
    private String custNm;
    private String custGbNm;
    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;

    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;           //  제외상품시퀀스
    private String cpnDesc;             // 쿠폰설명

    private String scmYn;

    // 사용가능고객구분
    @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;

    // 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;
    }
}
