package com.style24.persistence.domain;

import java.util.List;

import com.style24.persistence.TscBaseDomain;

import lombok.Data;

/**
 * 네이버페이 도메인
 * 
 * @author card007
 * @since 2021. 03. 07
 */
@SuppressWarnings("serial")
@Data
public class NaverPay extends TscBaseDomain {

	private String modelVersion;				// 결제 연동 방식
	private int merchantUserKey;				// 가맹점 주문내역 확인 가능한 가맹점 결제번호 또는 주문번호를 전달해야 합니다
	private String merchantPayKey;				// 가맹점의 사용자 키(개인 아이디와 같은 개인정보 데이터는 제외하여 전달해야 합니다)
	private String productName;					// 대표 상품명. 예: 장미의 이름 외 1건(X), 장미의 이름(O)
	private int productCount;					// 상품 수량 예: A 상품 2개 + B 상품 1개의 경우 productCount 3으로 전달
	private int totalPayAmount;					// 총 결제 금액. 최소 결제금액은 100원
	private String returnUrl;					// 결제 완료 후 이동할 URL(returnUrl + 가맹점 파라미터 전달이 가능합니다)
	private int taxScopeAmount;					// 과세 대상 금액. 과세 대상 금액 + 면세 대상 금액 = 총 결제 금액
	private int taxExScopeAmount;				// 면세 대상 금액. 과세 대상 금액 + 면세 대상 금액 = 총 결제 금액
	private int statusCode;						// 요청상태코드
	private String code;						// 결과코드
	private String message;						// 결과메세지
	private String paymentId;					// 결제번호
	private String startTime;					// 주문조회 시작일시
	private String endTime;						// 주문조회 종료일시
	private String approvalType;				// 주문조회 타입 (ALL:전체, APPROVAL:승인, CANCEL:취소, CANCEL_FAIL:취소실패)
	private int pageNumber;						// 조회하고자 하는 페이지번호 (값이 없으면 1로 간주)
	private int rowsPerPage;					// 페이지 당 row 건수 (1~100까지 지정 가능하며, 값이 없으면 20으로 간주)
	private Body body;

	@Data
	public class Body {
		private String reserveId;				// 결제예약키
		private String paymentId;				// 결제번호
		private Detail detail;					// 네이버페이 결제결과 상세정보
		private String payHistId;				// 취소 결제 번호
		private String primaryPayMeans;			// 취소 처리된 주 결제 수단(CARD: 신용카드, BANK: 계좌 이체)
		private int primaryPayCancelAmount;		// 주 결제 수단 취소 금액
		private int primaryPayRestAmount;		// 추가로 취소 가능한 주 결제 수단 잔여 결제 금액
		private int npointCancelAmount;			// 네이버페이 포인트 취소 금액
		private int npointRestAmount;			// 추가로 취소 가능한 네이버페이 포인트 잔여 결제 금액
		private String cancelYmdt;				// 취소 일시(YYYYMMDDHH24MMSS)
		private int totalRestAmount;			// 추가로 취소 가능한 전체 잔여 결제 금액(primaryPayRestAmount + npointRestAmount)
		private List<PaymentInfo> list;			// 결제 내역 배열
		private int totalCount;					// 조회조건에 대한 전체건수
		private int responseCount;				// 현재 페이지에 대한 응답건수
		private int totalPageCount;				// 전체 페이지 개수
		private int currentPageNumber;			// 응답 된 현재 페이지 번호

		@Data
		public class Detail {
			private String paymentId;				// 네이버페이 결제번호
			private String payHistId;				// 네이버페이 결제 이력 번호
			private String merchantId;				// 가맹점 아이디 (가맹점센터 로그인 아이디)
			private String merchantName;			// 가맹점명
			private String merchantPayKey;			// 가맹점의 결제번호
			private String merchantUserKey;			// 가맹점의 사용자 키
			private String admissionTypeCode;		// 결제승인 유형 (01:원결제 승인건, 03:전체취소 건, 04:부분취소 건)
			private String admissionYmdt;			// 결제/취소 일시(YYYYMMDDHH24MMSS)
			private String tradeConfirmYmdt;		// 거래완료 일시(정산기준날짜, YYYYMMDDHH24MMSS)
			private String admissionState;			// 결제/취소 시도에 대한 최종결과 (SUCCESS:완료, FAIL:실패)
			private int totalPayAmount;				// 총 결제/취소 금액
			private int primaryPayAmount;			// 주 결제 수단 결제/취소 금액
			private int npointPayAmount;			// 네이버페이 포인트 결제/취소 금액
			private String primaryPayMeans;			// 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
			private String cardCorpCode;			// 주 결제 수단 카드사
			private String cardNo;					// 일부 마스킹 된 신용카드 번호
			private String cardAuthNo;				// 카드승인번호
			private int cardInstCount;				// 할부 개월 수 (일시불은 0)
			private String bankCorpCode;			// 주 결제 수단 은행
			private String bankAccountNo;			// 일부 마스킹 된 계좌 번호
			private String productName;				// 상품명
			private Boolean settleExpected;			// 정산 예정 금액과 결제 수수료 금액이 계산되었는지 여부
			private int settleExpectAmount;			// 정산 예정 금액
			private int payCommissionAmount;		// 결제 수수료 금액
		}

		@Data
		public class PaymentInfo {
			private String paymentId;				// 네이버페이 결제번호
			private String payHistId;				// 네이버페이 결제 이력 번호
			private String merchantId;				// 가맹점 아이디 (가맹점센터 로그인 아이디)
			private String merchantName;			// 가맹점명
			private String merchantPayKey;			// 가맹점의 결제번호
			private String merchantUserKey;			// 가맹점의 사용자 키
			private String admissionTypeCode;		// 결제승인 유형 (01:원결제 승인건, 03:전체취소 건, 04:부분취소 건)
			private String admissionYmdt;			// 결제/취소 일시(YYYYMMDDHH24MMSS)
			private String tradeConfirmYmdt;		// 거래완료 일시(정산기준날짜, YYYYMMDDHH24MMSS)
			private String admissionState;			// 결제/취소 시도에 대한 최종결과 (SUCCESS:완료, FAIL:실패)
			private int totalPayAmount;				// 총 결제/취소 금액
			private int primaryPayAmount;			// 주 결제 수단 결제/취소 금액
			private int npointPayAmount;			// 네이버페이 포인트 결제/취소 금액
			private String primaryPayMeans;			// 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
			private String cardCorpCode;			// 주 결제 수단 카드사
			private String cardNo;					// 일부 마스킹 된 신용카드 번호
			private String cardAuthNo;				// 카드승인번호
			private int cardInstCount;				// 할부 개월 수 (일시불은 0)
			private String bankCorpCode;			// 주 결제 수단 은행
			private String bankAccountNo;			// 일부 마스킹 된 계좌 번호
			private String productName;				// 상품명
			private SettleInfo settleInfo;			// 정산 데이터 그룹

			@Data
			public class SettleInfo {
				private Boolean settleCreated;			// 정산 데이터 생성 여부
				private int primarySettleAmount;		// 주결제수단 정산 입금금액
				private int primaryCommissionAmount;	// 주결제수단 정산 수수료 금액
				private int npointSettleAmount;			// 네이버페이 포인트 정산 입금금액
				private int npointCommissionAmount;		// 네이버페이 정산 수수료 금액
			}
		}
	}

}
