<?php

namespace Yurun\PaySDK\AlipayApp\FTF\Params\Pay;

use Yurun\PaySDK\AlipayApp\FTF\Params\ExtendParams;

/**
 * 支付宝统一收单交易支付接口业务参数.
 */
class BusinessParams
{
    use \Yurun\PaySDK\Traits\JSONParams;

    /**
     * 商户订单号，64个字符以内、可包含字母、数字、下划线；需保证在商户端不重复.
     *
     * @var string
     */
    public $out_trade_no;

    /**
     * 支付场景
     * 条码支付，取值：bar_code
     * 声波支付，取值：wave_code.
     *
     * @var string
     */
    public $scene;

    /**
     * 支付授权码，25~30开头的长度为16~24位的数字，实际字符串长度以开发者获取的付款码长度为准.
     *
     * @var string
     */
    public $auth_code;

    /**
     * 销售产品码，与支付宝签约的产品码名称。
     *
     * @var string
     */
    public $product_code = 'FACE_TO_FACE_PAYMENT';

    /**
     * 订单总金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000].
     *
     * @var float
     */
    public $total_amount = 0;

    /**
     * 参与优惠计算的金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]。
     * 如果该值未传入，但传入了【订单总金额】和【不可打折金额】，则该值默认为【订单总金额】-【不可打折金额】.
     *
     * @var float
     */
    public $discountable_amount;

    /**
     * 订单标题.
     *
     * @var string
     */
    public $subject = '';

    /**
     * 买家的支付宝用户id，如果为空，会从传入了码值信息中获取买家ID.
     *
     * @var string
     */
    public $buyer_id;

    /**
     * 如果该值为空，则默认为商户签约账号对应的支付宝用户ID.
     *
     * @var string
     */
    public $seller_id;

    /**
     * 订单描述.
     *
     * @var string
     */
    public $body;

    /**
     * 订单包含的商品列表信息.
     *
     * @var array<\Yurun\PaySDK\AlipayApp\FTF\Params\GoodsDetail>
     */
    public $goods_detail;

    /**
     * 业务扩展参数，详见业务扩展参数说明.
     *
     * @var \Yurun\PaySDK\AlipayApp\FTF\Params\ExtendParams
     */
    public $extend_params;

    /**
     * 商户操作员编号.
     *
     * @var string
     */
    public $operator_id;

    /**
     * 商户门店编号.
     *
     * @var string
     */
    public $store_id;

    /**
     * 商户机具终端编号.
     *
     * @var string
     */
    public $terminal_id;

    /**
     * 该笔订单允许的最晚付款时间，逾期将关闭交易。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m.
     *
     * @var string
     */
    public $timeout_express;

    public function __construct()
    {
        $this->extend_params = new ExtendParams();
    }

    public function toString()
    {
        $obj = (array) $this;
        if (empty($obj['goods_detail']))
        {
            unset($obj['goods_detail']);
        }
        else
        {
            $obj['goods_detail'] = json_encode($obj['goods_detail']);
        }
        $result = $obj['extend_params']->toArray();
        if (null === $result)
        {
            unset($obj['extend_params']);
        }
        else
        {
            $obj['extend_params'] = $result;
        }
        foreach ($obj as $key => $value)
        {
            if (null === $value)
            {
                unset($obj[$key]);
            }
        }

        return json_encode($obj);
    }
}
