<?php

namespace app\common\util;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

/**
 * 表达式操作类
 */
class Salary
{
    /**
     * 计算
     * @param string $expression
     * @return array
     */
    public function evaluate(string $expression)
    {
        $language = new ExpressionLanguage();
        try {
            $result = $language->evaluate($expression);
            return ['code' => 0, 'msg' => '计算成功','data'=>$result];
        } catch (\Exception $exception) {
            return ['code' => 999, 'msg' => '公式格式不正确,请检查'];
        }
    }

    /**
     * @return void
     */
    public function compile(): void
    {
        $language = new ExpressionLanguage();
        var_dump($language->compile('1 + 2')); // displ
    }

      /**
     * @param $value
     * @param $num
     * @return array
     */
    function checkSalaryItem($value, $num): array
    {
        $bj_num = substr_count($value, '#');
        if ($bj_num % 2 == 0) {
            if ($bj_num == 0 && $num > 0) {
                return \app\facade\Salary::evaluate($value);
            }
            if (!str_contains($value, '#')) {
                return \app\facade\Salary::evaluate($value);
            }

            $var = $this->getBetweenAB($value);
            $res2 = (new SalaryItemModel)->detail(['variable' => $var]);
            if (!$res2) {
                return ['code' => 999, 'msg' => '公式错误,变量' . $var . '未找到'];
            }
            $value = str_replace('#' . $var . '#', $res2->value, $value);
            $num += 1;
            return $this->checkSalaryItem($value, $num);
        } else {
            return ['code' => 999, 'msg' => '公式错误,请检查变量#符号数量是否准确'];
        }
    }

    /**
     * @param $str
     * @param string $begin
     * @param string $end
     * @return string
     */
    private function getBetweenAB($str, string $begin = "#", string $end = "#"): string
    {
        if ($begin == '') return '';
        $beginPos = mb_strpos($str, $begin);
        if ($beginPos === false) return '';       // 起始字符不存在,直接返回空。合理
        $start = $beginPos + mb_strlen($begin);       // 1.1、开始截取下标
        if ($end == '') $endPos = mb_strlen($str);// 结束字符不存在,默认截取到字符串末尾。合理
        else $endPos = mb_strpos($str, $end, $start); // 1.2、从开始下标之后查找
        if ($endPos === false) $endPos = mb_strlen($str);
        $length = $endPos - $start;                   // 2、截取字符的长度
        return mb_substr($str, $start, $length);
    }
}