<?php


namespace Module\Vendor\Provider\HomePage;


use ModStart\Core\Exception\BizException;
use ModStart\Core\Util\AgentUtil;

class HomePageProvider
{
    /**
     * @var AbstractHomePageProvider[]
     */
    private static $instances = [
        DefaultHomePageProvider::class,
        DefaultMobileHomePageProvider::class,
    ];

    public static function register($provider)
    {
        self::$instances[] = $provider;
    }

    public static function registerQuick($title, $action, $type = [AbstractHomePageProvider::TYPE_PC, AbstractHomePageProvider::TYPE_MOBILE])
    {
        self::register(
            QuickHomePageProvider::make($title, $action, $type)
        );
    }

    /**
     * @return AbstractHomePageProvider[]
     */
    public static function all()
    {
        foreach (self::$instances as $k => $v) {
            if ($v instanceof \Closure) {
                self::$instances[$k] = call_user_func($v);
            } else if (is_string($v)) {
                self::$instances[$k] = app($v);
            }
        }
        return self::$instances;
    }

    private static function getAction($defaultAction)
    {
        $controller = null;
        if (modstart_config('HomePage_Enable', false)) {
            if (AgentUtil::isMobile()) {
                $controller = modstart_config('HomePage_HomeMobile');
            }
            if (empty($controller)) {
                $controller = modstart_config('HomePage_Home');
            }
        }
        if (empty($controller)) {
            $controller = $defaultAction;
        }
        BizException::throwsIfEmpty('首页不存在', $controller);
        return $controller;
    }

    public static function call($contextMethod, $defaultAction)
    {
        $controller = self::getAction($defaultAction);
        list($c, $a) = explode('@', $controller);
        list($contextC, $contextA) = explode('::', $contextMethod);
        if (!starts_with($contextC, '\\')) {
            $contextC = '\\' . $contextC;
        }
        if ($contextC == $c && $contextA == $a) {
            list($c, $a) = explode('@', $defaultAction);
        }
        $c = app($c);
        return app()->call([$c, $a]);
    }
}