<?php

namespace Atom\runtime_7456b800;

/**
 * 组件配置类 供有对php部分进行单独配置需求的组件继承
 *
 * @package Atom\runtime_7456b800
 * @auther lvsheng
 */
class Atom_Config_Base {
    /**
     * @var callable
     */
    private $_renderCallable;

    /**
     * 组件实例的php文件路径
     * @var string
     */
    public $componentPath = "";

    /**
     * Atom_Config_Base constructor.
     * @param $renderFunctionName callable
     */
    public function __construct($renderFunctionName, $componentPath) {
        $this->_renderCallable = $renderFunctionName;
        $this->componentPath = $componentPath;
    }

    /**
     * @param $ctx
     * @return string
     * @throws Exception
     */
    public function render($ctx, $isXml = false) {

        $renderCallable = $this->_renderCallable;

        if (!isset($renderCallable)) {
            throw new \Exception('[Atom Runtime] render of component ' . $ctx->componentPath . ' config ' . get_class($this) . ' is not defined!');
        }
        if (!is_callable($renderCallable)) {
            throw new \Exception('[Atom Runtime] render of component ' . $ctx->componentPath . ' config' . get_class($this) . ' is not callable!');
        }

        return call_user_func($renderCallable, $ctx, $isXml);
    }


    /** 全局辅助函数 - Math */

    /**
     * @param $value
     * @return mixed
     */
    public function math_floor ($value) {
        return floor($value);
    }

    /**
     * @param $value
     * @return float
     */
    public function math_ceil ($value) {
        return ceil($value);
    }

    /**
     * @param $value
     * @return float
     */
    public function math_round ($value) {
        return round($value);
    }

    /**
     * @param $value
     * @return number
     */
    public function math_abs ($value) {
        return abs($value);
    }

    /**
     * @param {number} ...$value
     * @return number
     */
    public function math_max () {
        $arr = func_get_args();
        return call_user_func_array('max', $arr);
    }

    /**
     * @param {number} ...$value
     * @return number
     */
    public function math_min () {
        $arr = func_get_args();
        return call_user_func_array('min', $arr);
    }

    /**
     * @param $base
     * @param $exp
     * @return number
     */
    public function math_pow ($base, $exp) {
        return pow($base, $exp);
    }

    /**
     * @param $arr
     * @param $start
     * @param $len
     * @return array
     */
    public function array_slice () {
        $args = func_get_args();
        return call_user_func_array('array_slice', $args);
    }

    /**
     * @param $arr
     * @param $separator
     * @return string
     */
    public function array_join ($arr, $separator) {
        return join($separator, $arr);
    }

    /**
     * @param $str
     * @param $pos
     * @return number
     */
    public function str_pos ($str, $match) {
        $index = strpos($str, $match);
        return $index === false ? -1 : $index;
    }

    /**
     * lower filter
     * @param $val string
     * @return string
     */
    public function filter_lower($val) {
        return strtolower($val);
    }

    /**
     * json filter
     * @param $data array
     * @return string
     */
    public function filter_json ($data) {
        return json_encode($data);
    }
}
