<?php

namespace core\pay;

use core\loader\Storage;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\MessageInterface;
use Yansongda\Supports\Collection;

/**
 * 文件管理驱动类
 * Class BasePay
 */
abstract class BasePay extends Storage
{
    protected $config;//配置

    /**
     * 初始化
     * @param array $config
     * @return void
     */
    protected function initialize(array $config = [])
    {

    }

    /**
     * 网页支付
     * @param array $params
     * @return mixed
     */
    abstract protected function web(array $params);

    /**
     * 手机网站支付
     * @param array $params
     * @return mixed
     */
    abstract protected function wap(array $params);

    /**
     * app支付
     * @param array $params
     * @return mixed
     */
    abstract protected function app(array $params);

    /**
     * 小程序支付
     * @param array $params
     * @return mixed
     */
    abstract protected function mini(array $params);

    /**
     * 付款码支付
     * @param array $params
     * @return mixed
     */
    abstract protected function pos(array $params);

    /**
     * 扫码支付
     * @param array $params
     * @return mixed
     */
    abstract protected function scan(array $params);

    /**
     * 转账
     * @param array $params
     * @return mixed
     */
    abstract protected function transfer(array $params);

    /**
     * 公众号支付
     * @param array $params
     * @return mixed
     */
    abstract protected function mp(array $params);

    /**
     * 支付关闭
     * @param string $out_trade_no
     * @return mixed
     */
    abstract protected function close(string $out_trade_no);

    /**
     * 退款
     * @param array $params
     * @return mixed
     */
    abstract protected function refund(array $params);

    /**
     * 支付通知
     * @param string $action
     * @param callable $callback
     * @return mixed
     */
    abstract protected function notify(string $action, callable $callback);

    /**
     * 查询支付订单
     * @param array $params
     * @return mixed
     */
    abstract protected function getOrder(array $params);

    /**
     * 查询退款订单
     * @param string $out_trade_no
     * @param string|null $refund_no
     * @return mixed
     */
    abstract protected function getRefund(string $out_trade_no, ?string $refund_no);

    /**
     * 查询转账订单
     * @param string $transfer_no
     * @return mixed
     */
    abstract protected function getTransfer(string $transfer_no, $out_transfer_no = '');

    /**
     * 取消转账
     * @param array $params
     * @return mixed
     */
    abstract protected function transferCancel(array $params);

    /**
     * 初始化
     * @param array $config
     * @param string $type
     * @return mixed
     */
    protected function payConfig(array $config, string $type)
    {
        return array_merge(
            [
                'logger' => [
                    'enable' => true,
                    'file' => root_path('runtime') . 'paylog' . DIRECTORY_SEPARATOR . date('Ym') . DIRECTORY_SEPARATOR . date('d') . '.log',
                    'level' => env('app_debug') ? 'debug' : 'info', // 建议生产环境等级调整为 info,开发环境为 debug
                    'type' => 'single', // optional, 可选 daily.
                    'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
                ],
                'http' => [ // optional
                    'timeout' => 5.0,
                ]
            ],
            [
                $type => [
                    'default' => $config
                ]
            ],
            ['_force' => true]
        );
    }

    public function returnFormat($param)
    {
        if ($param instanceof MessageInterface || $param instanceof Response) {
            $return_value =  $param->getBody()->getContents();
        } else if ($param instanceof Collection) {
            $return_value = $param->toArray();
        } else {
            $return_value = $param;
        }
        return $return_value;
    }

    /**
     * 解析退款返回数据并解析
     * @param $our_trade_no
     * @param $refund_no
     * @param $status
     * @param int $success_time
     * @param string $reason
     * @return array
     */
    public function getRefundData($our_trade_no, $refund_no, $status, $success_time = 0, $reason = '')
    {
        return [
            'our_trade_no' => $our_trade_no,
            'refund_no' => $refund_no,
            'status' => $status,
            'success_time' => $success_time,
            'reason' => $reason
        ];
    }

    /**
     * 获取转账数据并解析
     * @param $transfer_no
     * @param $status
     * @param $reason
     * @return void
     */
    public function getTransferData($transfer_no, $status, $reason)
    {

    }


}