package cokr.xit.ens.modules.common.ctgy.intgrnbill.nv.service.process.model;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.annotations.SerializedName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
 * 네이버페이 결제결과 요청데이터
 */
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
public class NvPayResultDetail {
    @NotBlank(message = "결제번호는 필수 입력값 입니다.")
    @Length(max = 50, message = "결제번호의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "네이버페이 결제번호", example = " ")
    @JsonProperty("paymentId")  
    @JsonAlias({"payment_id"})
    @SerializedName(value = "paymentId", alternate = {"payment_id"})
    private String paymentId;

    @NotBlank(message = "결제 이력번호는 필수 입력값 입니다.")
    @Length(max = 50, message = "결제 이력번호의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "네이버페이 결제 이력 번호", example = " ")
    @JsonProperty("payHistId")  
    @JsonAlias({"pay_hist_id"})
    @SerializedName(value = "payHistId", alternate = {"pay_hist_id"})
    private String payHistId;
    @Length(max = 50, message = "가맹점 아이디의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "가맹점 아이디(가맹점센터 로그인 아이디)", example = " ")
    @JsonProperty("merchantId")  
    @JsonAlias({"merchant_id"})
    @SerializedName(value = "merchantId", alternate = {"merchant_id"})
    private String merchantId;
    @Length(max = 50, message = "가맹점명의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "가맹점명", example = " ")
    @JsonProperty("merchantName")  
    @JsonAlias({"merchant_name"})
    @SerializedName(value = "merchantName", alternate = {"merchant_name"})
    private String merchantName;
    @Length(max = 64, message = "가맹점의 결제번호의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "가맹점의 결제번호", example = " ")
    @JsonProperty("merchantPayKey")  
    @JsonAlias({"merchant_pay_key"})
    @SerializedName(value = "merchantPayKey", alternate = {"merchant_pay_key"})
    private String merchantPayKey;
    @Length(max = 50, message = "가맹점의 사용자 키의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "가맹점의 사용자 키", example = " ")
    @JsonProperty("merchantUserKey")  
    @JsonAlias({"merchant_user_key"})
    @SerializedName(value = "merchantUserKey", alternate = {"merchant_user_key"})
    private String merchantUserKey;
    @Length(max = 2, message = "결제승인 유형의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "결제승인 유형", example = " ")
    @JsonProperty("admissionTypeCode")  
    @JsonAlias({"admission_type_code"})
    @SerializedName(value = "admissionTypeCode", alternate = {"admission_type_code"})
    private String admissionTypeCode;
    @Length(max = 14, message = "결제/취소일시의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "결제/취소 일시(YYYYMMDDHH24MISS)", example = " ")
    @JsonProperty("admissionYmdt")  
    @JsonAlias({"admission_ymdt"})
    @SerializedName(value = "admissionYmdt", alternate = {"admission_ymdt"})
    private String admissionYmdt;
    @Length(max = 50, message = "거래완료 일시의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "거래완료 일시(정산기준날짜, YYYYMMDDHH24MISS)", example = " ")
    @JsonProperty("tradeConfirmYmdt")  
    @JsonAlias({"trade_confirm_ymdt"})
    @SerializedName(value = "tradeConfirmYmdt", alternate = {"trade_confirm_ymdt"})
    private String tradeConfirmYmdt;
    @Length(max = 10, message = "결제/취소 시도 최종결과의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "결제/취소 시도에 대한 최종결과", example = " ")
    @JsonProperty("admissionState")  
    @JsonAlias({"admission_state"})
    @SerializedName(value = "admissionState", alternate = {"admission_state"})
    private String admissionState;
    @Schema(required = true, title = "총 결제 금액", example = " ")
    @JsonProperty("totalPayAmount")  
    @JsonAlias({"total_pay_amount"})
    @SerializedName(value = "totalPayAmount", alternate = {"total_pay_amount"})
    private Integer totalPayAmount;
    @Schema(required = true, title = "주 결제 수단 결제 금액", example = " ")
    @JsonProperty("primaryPayAmount")  
    @JsonAlias({"primary_pay_amount"})
    @SerializedName(value = "primaryPayAmount", alternate = {"primary_pay_amount"})
    private Integer primaryPayAmount;
    @Schema(required = true, title = "네이버페이 포인트/머니 결제 금액", example = " ")
    @JsonProperty("npointPayAmount")  
    @JsonAlias({"npoint_pay_amount"})
    @SerializedName(value = "npointPayAmount", alternate = {"npoint_pay_amount"})
    private Integer npointPayAmount;
    @Schema(required = true, title = "기프트카드 결제 금액", example = " ")
    @JsonProperty("giftCardAmount")  
    @JsonAlias({"gift_card_amount"})
    @SerializedName(value = "giftCardAmount", alternate = {"gift_card_amount"})
    private Integer giftCardAmount;
    @Schema(required = true, title = "과세 결제 금액", example = " ")
    @JsonProperty("taxScopeAmount")  
    @JsonAlias({"tax_scope_amount"})
    @SerializedName(value = "taxScopeAmount", alternate = {"tax_scope_amount"})
    private Integer taxScopeAmount;
    @Schema(required = true, title = "면세 결제 금액", example = " ")
    @JsonProperty("taxExScopeAmount")  
    @JsonAlias({"tax_ex_scope_amount"})
    @SerializedName(value = "taxExScopeAmount", alternate = {"tax_ex_scope_amount"})
    private Integer taxExScopeAmount;
    @Schema(required = true, title = "컵 보증금 결제 금액", example = " ")
    @JsonProperty("environmentDepositAmount")  
    @JsonAlias({"environment_deposit_amount"})
    @SerializedName(value = "environmentDepositAmount", alternate = {"environment_deposit_amount"})
    private Integer environmentDepositAmount;
    @Length(max = 10, message = "주 결제 수단의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "주 결제 수단", example = " ")
    @JsonProperty("primaryPayMeans")  
    @JsonAlias({"primary_pay_means"})
    @SerializedName(value = "primaryPayMeans", alternate = {"primary_pay_means"})
    private String primaryPayMeans;
    @Length(max = 10, message = "주 결제 수단 카드사의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "주 결제 수단 카드사", example = " ")
    @JsonProperty("cardCorpCode")  
    @JsonAlias({"card_corp_code"})
    @SerializedName(value = "cardCorpCode", alternate = {"card_corp_code"})
    private String cardCorpCode;
    @Length(max = 50, message = "일부 마스킹 된 신용카드 번호의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "일부 마스킹 된 신용카드 번호", example = " ")
    @JsonProperty("cardNo")  
    @JsonAlias({"card_no"})
    @SerializedName(value = "cardNo", alternate = {"card_no"})
    private String cardNo;
    @Length(max = 30, message = "카드승인번호의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "카드승인번호", example = " ")
    @JsonProperty("cardAuthNo")  
    @JsonAlias({"card_auth_no"})
    @SerializedName(value = "cardAuthNo", alternate = {"card_auth_no"})
    private String cardAuthNo;
    @Schema(required = true, title = "할부 개월 수(일시불은 0)", example = " ")
    @JsonProperty("cardInstCount")  
    @JsonAlias({"card_inst_count"})
    @SerializedName(value = "cardInstCount", alternate = {"card_inst_count"})
    private Integer cardInstCount;
    @Schema(required = true, title = "카드사 포인트 사용유무", example = " ")
    @JsonProperty("usedCardPoint")  
    @JsonAlias({"used_card_point"})
    @SerializedName(value = "usedCardPoint", alternate = {"used_card_point"})
    private Boolean usedCardPoint;
    @Length(max = 10, message = "주 결제 수단 은행의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "주 결제 수단 은행", example = " ")
    @JsonProperty("bankCorpCode")  
    @JsonAlias({"bank_corp_code"})
    @SerializedName(value = "bankCorpCode", alternate = {"bank_corp_code"})
    private String bankCorpCode;
    @Length(max = 50, message = "일부 마스킹 된 계좌번호의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "일부 마스킹 된 계좌번호", example = " ")
    @JsonProperty("bankAccountNo")  
    @JsonAlias({"bank_account_no"})
    @SerializedName(value = "bankAccountNo", alternate = {"bank_account_no"})
    private String bankAccountNo;
    @Length(max = 128, message = "상품명의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "상품명", example = " ")
    @JsonProperty("productName")  
    @JsonAlias({"product_name"})
    @SerializedName(value = "productName", alternate = {"product_name"})
    private String productName;
    @Schema(required = true, title = "정산예정금액과 결제 수수료금액 계산 여부(true/false)", example = " ")
    @JsonProperty("settleExpected")  
    @JsonAlias({"settle_expected"})
    @SerializedName(value = "settleExpected", alternate = {"settle_expected"})
    private Boolean settleExpected;
    @Schema(required = true, title = "정산 예정 금액", example = " ")
    @JsonProperty("settleExpectAmount")  
    @JsonAlias({"settle_expect_amount"})
    @SerializedName(value = "settleExpectAmount", alternate = {"settle_expect_amount"})
    private Integer settleExpectAmount;
    @Schema(required = true, title = "결제 수수료 금액", example = " ")
    @JsonProperty("payCommissionAmount")  
    @JsonAlias({"pay_commission_amount"})
    @SerializedName(value = "payCommissionAmount", alternate = {"pay_commission_amount"})
    private Integer payCommissionAmount;
    @Schema(required = true, title = "도서/공연 소득공제 여부", example = " ")
    @JsonProperty("extraDeduction")  
    @JsonAlias({"extra_deduction"})
    @SerializedName(value = "extraDeduction", alternate = {"extra_deduction"})
    private Boolean extraDeduction;
    @Length(max = 8, message = "이용완료일의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "이용완료일(yyyymmdd)", example = " ")
    @JsonProperty("useCfmYmdt")  
    @JsonAlias({"use_cfm_ymdt"})
    @SerializedName(value = "useCfmYmdt", alternate = {"use_cfm_ymdt"})
    private String useCfmYmdt;
    @Length(max = 400, message = "별도 예비필드의 최대 길이를 초과 했습니다.")
    @Schema(required = true, title = "별도 예비필드", example = " ")
    @JsonProperty("merchantExtraParameter")  
    @JsonAlias({"merchant_extra_parameter"})
    @SerializedName(value = "merchantExtraParameter", alternate = {"merchant_extra_parameter"})
    private String merchantExtraParameter;
    @Length(max = 28, message = "암호화된 사용자 구분값의 최대 길이를 초과 했습니다.")
    @Schema(required = false, title = "암호화된 사용자 구분값", example = " ")
    @JsonProperty("userIdentifier")  
    @JsonAlias({"user_identifier"})
    @SerializedName(value = "userIdentifier", alternate = {"user_identifier"})
    private String userIdentifier;
}