/**
 * Copyright 2019 the original author or authors.
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.github.thierrysquirrel.alipay.pay.refund.param;

import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.OpenApiRoyaltyDetailInfoPojo;
import com.github.thierrysquirrel.alipay.pay.refund.PayRefundChain;
import lombok.Data;

import java.util.List;

/**
 * ClassName: PayRefundParamChain
 * Description: Document Address https://docs.open.alipay.com/api_1/alipay.trade.refund
 * 文档地址 https://docs.open.alipay.com/api_1/alipay.trade.refund
 * date: 2019/12/25 17:33
 *
 * @author ThierrySquirrel
 * @since JDK 1.8
 */
@Data
public class PayRefundParamChain {
    private AlipayClient alipayClient;
    private AlipayTradeRefundModel alipayTradeRefundModel;

    public PayRefundParamChain(AlipayClient alipayClient, AlipayTradeRefundModel alipayTradeRefundModel) {
        this.alipayClient = alipayClient;
        this.alipayTradeRefundModel = alipayTradeRefundModel;
    }

    /**
     * Builder PayRefundChain
     * <p>
     * 构建 PayRefundChain
     *
     * @return PayRefundChain
     */
    public PayRefundChain builder() {
        return new PayRefundChain (alipayClient, alipayTradeRefundModel);
    }

    /**
     * !!This Is An Indispensable Parameter
     * The Merchant Order Number Passed In During Order Payment Cannot Be Empty At The Same Time As TradeNo
     * <p>
     * !!这是不可缺参数
     * 订单支付时传入的商户订单号,不能和 tradeNo同时为空.
     *
     * @param outTradeNo outTradeNo
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderOutTradeNo(String outTradeNo) {
        alipayTradeRefundModel.setOutTradeNo (outTradeNo);
        return this;
    }

    /**
     * !!This Is An Indispensable Parameter
     * AliPay Transaction Number And Merchant Order Number Can Not Be Empty At The Same Time.
     * <p>
     * !!这是不可缺参数
     * 支付宝交易号,和商户订单号不能同时为空
     *
     * @param tradeNo tradeNo
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderTradeNo(String tradeNo) {
        alipayTradeRefundModel.setTradeNo (tradeNo);
        return this;
    }

    /**
     * !!This Is An Indispensable Parameter
     * The Amount To Be Refunded Cannot Be Greater Than The Order Amount.
     * The Unit Is Yuan And Two Decimal Places Are Supported
     * <p>
     * !!这是不可缺参数
     * 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
     *
     * @param refundAmount refundAmount
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderRefundAmount(String refundAmount) {
        alipayTradeRefundModel.setRefundAmount (refundAmount);
        return this;
    }

    /**
     * Order refund currency information
     * <p>
     * 订单退款币种信息
     *
     * @param refundCurrency refundCurrency
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderRefundCurrency(String refundCurrency) {
        alipayTradeRefundModel.setRefundCurrency (refundCurrency);
        return this;
    }

    /**
     * Reason for refund
     * <p>
     * 退款的原因说明
     *
     * @param refundReason refundReason
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderRefundReason(String refundReason) {
        alipayTradeRefundModel.setRefundReason (refundReason);
        return this;
    }

    /**
     * Identify A Refund Request.
     * Multiple Refunds Of The Same Transaction Need To Be Unique.
     * If Partial Refund Is Required, This Parameter Must Be Passed.
     * <p>
     * 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传.
     *
     * @param outRequestNo outRequestNo
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderOutRequestNo(String outRequestNo) {
        alipayTradeRefundModel.setOutRequestNo (outRequestNo);
        return this;
    }

    /**
     * Merchant's Operator Number
     * <p>
     * 商户的操作员编号
     *
     * @param operatorId operatorId
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderOperatorId(String operatorId) {
        alipayTradeRefundModel.setOperatorId (operatorId);
        return this;
    }

    /**
     * Merchant's Store Number
     * <p>
     * 商户的门店编号
     *
     * @param storeId storeId
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderStoreId(String storeId) {
        alipayTradeRefundModel.setStoreId (storeId);
        return this;
    }

    /**
     * Merchant's Terminal Number
     * <p>
     * 商户的终端编号
     *
     * @param terminalId terminalId
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderTerminalId(String terminalId) {
        alipayTradeRefundModel.setTerminalId (terminalId);
        return this;
    }

    /**
     * Item List Information Included In Refund, JSON Format.
     * Document Address https://docs.open.alipay.com/api_1/alipay.trade.refund
     * <p>
     * 退款包含的商品列表信息,JSON格式.
     * 文档地址 https://docs.open.alipay.com/api_1/alipay.trade.refund
     *
     * @param goodsDetail goodsDetail
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderGoodsDetail(List<GoodsDetail> goodsDetail) {
        alipayTradeRefundModel.setGoodsDetail (goodsDetail);
        return this;
    }

    /**
     * Return Sub Ledger Details
     * Document Address https://docs.open.alipay.com/api_1/alipay.trade.refund
     * <p>
     * 退分账明细信息
     * 文档地址 https://docs.open.alipay.com/api_1/alipay.trade.refund
     *
     * @param refundRoyaltyParameters refundRoyaltyParameters
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderRefundRoyaltyParameters(List<OpenApiRoyaltyDetailInfoPojo> refundRoyaltyParameters) {
        alipayTradeRefundModel.setRefundRoyaltyParameters (refundRoyaltyParameters);
        return this;
    }

    /**
     * It Is Useful In The Bank To Bank Mode. Please Do Not Use It In Other Scenarios;
     * Through This Parameter, The Double Link Specifies The PID Of The Acquirer Of The Exchange To Be Refunded;
     * <p>
     * 银行间联模式下有用,其它场景请不要使用:
     * 双联通过该参数指定需要退款的交易所属收单机构的PID;
     *
     * @param orgPid orgPid
     * @return PayRefundParamChain
     */
    public PayRefundParamChain builderOrgPid(String orgPid) {
        alipayTradeRefundModel.setOrgPid (orgPid);
        return this;
    }
}