package com.ruoyi.newwxpay.transfer;

import com.google.gson.annotations.SerializedName;
import com.wechat.pay.java.core.cipher.Encryption;
import com.wechat.pay.java.core.util.StringUtil;
import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
import com.wechat.pay.java.service.transferbatch.model.TransferDetailInput;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.UnaryOperator;

/**
 * 单笔转账到零钱
 */
public class InitiateSingleTransferRequest implements Serializable {


    /**
     * 必填
     * 【商户AppID】 是微信开放平台和微信公众平台为开发者的应用程序
     * (APP、小程序、公众号、企业号corpid即为此AppID)提供的一个唯
     * 一标识。此处，可以填写这四种类型中的任意一种APPID，但请确保
     * 该appid与商户号有绑定关系
     */

    @SerializedName("appid")
    private String appid;
    /**
     * 必填
     * 【商户单号】 商户系统内部的商家单号，要求此参数只能由数字、大小写字母组成，在商户系统内部唯一
     */
    @SerializedName("out_bill_no")
    @NotBlank(message = "商户单号不能为空")
    private String outBillNo;
    /**
     * 必填【转账场景ID】 该笔转账使用的转账场景，可前往“商户平台-产品中心-商家转账”中申请。如：1000（现金营销），1006（企业报销）等
     */
    @SerializedName("transfer_scene_id")
    private String transferSceneId;

    /**
     * 必填 【收款用户OpenID】 用户在商户appid下的唯一标识。发起转账前需获取到用户的OpenID
     */
    @SerializedName("openid")
    @NotBlank(message = "收款用户OpenID不能为空")
    private String openId;

    /**
     * 必填 【转账金额】 转账金额单位为“分”
     */
    @NotNull(message = "转账金额不能为空")
    @SerializedName("transfer_amount")
    private Long transferAmount;

    /**
     * 必填 【转账备注】 转账备注，用户收款时可见该备注信息，UTF8编码，最多允许32个字符
     */
    @SerializedName("transfer_remark")
    private String transferRemark;

    /**
     * 必填 【转账场景报备信息】 各转账场景下需报备的内容，商户需要按照所属转账场景规则传参，详见转账场景报备信息字段说明。
     */
    @Size(min =1, max = 10,message = "转账场景报备信息数量超出限制")
    @Encryption
    @SerializedName("transfer_scene_report_infos")
    private List<TransferSceneReportInfo> transferSceneReportInfoList = new ArrayList();



    /**
     * 【收款用户姓名】 收款方真实姓名。需要加密传入，支持标准RSA算法和国密算法，公钥由微信侧提供。
     * 转账金额 >= 2,000元时，该笔明细必须填写
     * 若商户传入收款用户姓名，微信支付会校验收款用户与输入姓名是否一致，并提供电子回单
     */
    @SerializedName("user_name")
    private String userName;

    /**
     * 【通知地址】 异步接收微信支付结果通知的回调地址，通知url必须为公网可访问的URL，必须为HTTPS，不能携带参数。
     */
    @SerializedName("notify_url")
    private String notifyUrl;


    /**
     * 用户收款时感知到的收款原因将根据转账场景自动展示默认内容。如有其他展示需求，可在本字段传入。各场景展示的默认内容和支持传入的内容，可查看产品文档了解。
     */
    @SerializedName("user_recv_perception")
    private String userReCvPerception;


    public InitiateSingleTransferRequest cloneWithCipher(UnaryOperator<String> s) {
        InitiateSingleTransferRequest copy = new InitiateSingleTransferRequest();
        copy.appid = this.appid;
        copy.outBillNo = this.outBillNo;
        copy.transferSceneId = this.transferSceneId;
        copy.openId = this.openId;
        copy.transferAmount = this.transferAmount;
        copy.transferRemark = this.transferRemark;
        copy.userName = this.userName;
        copy.notifyUrl = this.notifyUrl;


        if (this.transferSceneReportInfoList != null && this.transferSceneReportInfoList.size() != 0) {
            copy.transferSceneReportInfoList = new ArrayList();
            Iterator var3 = this.transferSceneReportInfoList.iterator();

            while(var3.hasNext()) {
                TransferSceneReportInfo val = (TransferSceneReportInfo)var3.next();
                if (val != null) {
                    copy.transferSceneReportInfoList.add(val.cloneWithCipher(s));
                }
            }
        }

        return copy;
    }

    public InitiateSingleTransferRequest() {

    }
    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getOutBillNo() {
        return outBillNo;
    }

    public void setOutBillNo(String outBillNo) {
        this.outBillNo = outBillNo;
    }

    public String getTransferSceneId() {
        return transferSceneId;
    }

    public void setTransferSceneId(String transferSceneId) {
        this.transferSceneId = transferSceneId;
    }

    public String getOpenId() {
        return openId;
    }

    public void setOpenId(String openId) {
        this.openId = openId;
    }

    public Long getTransferAmount() {
        return transferAmount;
    }

    public void setTransferAmount(Long transferAmount) {
        this.transferAmount = transferAmount;
    }

    public String getTransferRemark() {
        return transferRemark;
    }

    public void setTransferRemark(String transferRemark) {
        this.transferRemark = transferRemark;
    }

    public List<TransferSceneReportInfo> getTransferSceneReportInfoList() {
        return transferSceneReportInfoList;
    }

    public void setTransferSceneReportInfoList(List<TransferSceneReportInfo> transferSceneReportInfoList) {
        this.transferSceneReportInfoList = transferSceneReportInfoList;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

    public String getUserReCvPerception() {
        return userReCvPerception;
    }

    public void setUserReCvPerception(String userReCvPerception) {
        this.userReCvPerception = userReCvPerception;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class InitiateSingleTransferRequest {\n");
        sb.append("    appid: ").append(StringUtil.toIndentedString(this.appid)).append("\n");
        sb.append("    outBillNo: ").append(StringUtil.toIndentedString(this.outBillNo)).append("\n");
        sb.append("    transferSceneId: ").append(StringUtil.toIndentedString(this.transferSceneId)).append("\n");
        sb.append("    openId: ").append(StringUtil.toIndentedString(this.openId)).append("\n");
        sb.append("    transferAmount: ").append(StringUtil.toIndentedString(this.transferAmount)).append("\n");
        sb.append("    transferRemark: ").append(StringUtil.toIndentedString(this.transferRemark)).append("\n");
        sb.append("    userName: ").append(StringUtil.toIndentedString(this.userName)).append("\n");
        sb.append("    userReCvPerception: ").append(StringUtil.toIndentedString(this.userReCvPerception)).append("\n");
        sb.append("    transferSceneReportInfoList: ").append(StringUtil.toIndentedString(this.transferSceneReportInfoList)).append("\n");
        sb.append("    notifyUrl: ").append(StringUtil.toIndentedString(this.notifyUrl)).append("\n");

        sb.append("}");
        return sb.toString();
    }


}
