TiktokShop.php 4.0 KB
<?php

namespace Lackoxygen\TiktokShop;

use Illuminate\Support\Arr;
use Lackoxygen\TiktokShop\Attribute\Config;
use Lackoxygen\TiktokShop\Passage\PassageProxy;
use Lackoxygen\TiktokShop\Passage\Verify;

/**
 *@method Verify verify()
 * @method Passage\Pigeon\PigeonInterface pigeon()
 * @method Passage\Sms\SmsInterface sms()
 * @method Passage\SupplyChain\SupplyChainInterface supplyChain()
 * @method Passage\Topup\TopupInterface topup()
 * @method Passage\OpenCloud\OpenCloudInterface openCloud()
 * @method Passage\Btas\BtasInterface btas()
 * @method Passage\Recycle\RecycleInterface recycle()
 * @method Passage\Member\MemberInterface member()
 * @method Passage\Buyin\BuyinInterface buyin()
 * @method Passage\Yunc\YuncInterface yunc()
 * @method Passage\OrderCode\OrderCodeInterface orderCode()
 * @method Passage\Coupons\CouponsInterface coupons()
 * @method Passage\Crossborder\CrossborderInterface crossborder()
 * @method Passage\Iop\IopInterface iop()
 * @method Passage\Antispam\AntispamInterface antispam()
 * @method Passage\Token\TokenInterface token()
 * @method Passage\Order\OrderInterface order()
 * @method Passage\AfterSale\AfterSaleInterface afterSale()
 * @method Passage\Logistics\LogisticsInterface logistics()
 * @method Passage\Warehouse\WarehouseInterface warehouse()
 * @method Passage\Product\ProductInterface product()
 * @method Passage\Material\MaterialInterface material()
 * @method Passage\Address\AddressInterface address()
 */
class TiktokShop
{
    /**
     * @var Config
     */
    protected Config $config;

    /**
     * @var array|string[]
     */
    protected array $fixedPassages = [
        'verify' => Verify::class
    ];

    /**
     * @param $options
     */
    public function __construct($options = null)
    {
        if (!$options instanceof Config) {
            if (is_array($options)) {
                $config = static::newConfig($options);
                goto next;
            }

            $app = $options ?: 'default';

            $config = \config(TiktokShopProvider::$name . '.' . $app);

            if (!is_array($config)) {
                throw new \InvalidArgumentException('config file not found');
            }
            $config = static::newConfig($config);
        } else {
            $config = $options;
        }
        next:
        $this->config = $config;
    }

    /**
     * @param array $options
     *
     * @return Config
     */
    public static function newConfig(array $options): Config
    {
        return new Config(
            Arr::get($options, 'app_key'),
            Arr::get($options, 'app_secret'),
            Arr::get($options, 'base_uri'),
            (float)Arr::get($options, 'timeout'),
            Arr::get($options, 'enable_mock')
        );
    }

    /**
     * @param $options
     *
     * @return TiktokShop
     */
    public static function use($options = null): TiktokShop
    {
        return new static($options);
    }

    /**
     * @param string $accessToken
     *
     * @return $this
     */
    public function setAccessToken(string $accessToken): TiktokShop
    {
        $this->config->setAccessToken($accessToken);

        return $this;
    }

    /**
     * @param string $name
     * @return string
     */
    private function guide(string $name): string
    {
        if (isset($this->fixedPassages[$name])) {
            return $this->fixedPassages[$name];
        }

        $name = ucfirst($name);

        $target = '\Lackoxygen\TiktokShop\Passage\\' . $name . '\\' . $name;

        if (!class_exists($target)) {
            throw new \OverflowException('class file(' . $target . ') not found');
        }

        return $target;
    }

    /**
     * @param $name
     * @param array $arguments
     *
     * @return PassageProxy
     */
    public function __call($name, array $arguments = [])
    {
        $passage = $this->guide($name);
        try {
            return PassageProxy::proxy($passage, $this->config);
        } finally {
            register_shutdown_function(function () {
                $this->config->setAccessToken('');
            });
        }
    }
}