<?php
/**
 * Created by PhpStorm.
 * User: 中闽 < 1464674022@qq.com >
 * Date: 2019/12/5
 * Time: 17:44
 */

namespace app\common\model;

use file\PathHelper;

class ArticleCate extends Tree
{
    // 关闭自动写入update_time字段
    protected $updateTime = false;


    //status_text 分类状态
    public function getStatusTextAttr($value, $data)
    {
        $status = [0 => '隐藏', 1 => '显示'];
        return $status[$data['status']];
    }

    //article_count 文章数量
    public function getArticleCountAttr($value, $data)
    {
        return $this->hasMany('Article')->where('status', Article::STATUS_OPEN)->count();
    }

    /**
     * 发布路径
     * 如果存在上级英文名，则拼接上级目录
     * 如果没有分类英文名称，则使用分类拼音
     * @param bool $auto 是否自动生成英文别名
     * @return mixed|string
     */
    public function tpath($auto = false)
    {
        $tpath = "";
        if ($this->pid) {
            $pnode = $this->getDirectParentNode();
            if ($pnode && $pnode->tpath()) {
                $tpath = $pnode->tpath();
            }
        }
        $enname = $this->en_name;
        if (!$this->en_name && $auto) {
            $enname = toPinyin($this->getData('title'));
        }
        if ($tpath && $enname) {
            return $tpath . appendStartDS($enname, '/');
        } else {
            return $enname ?: $tpath;
        }
    }

    /**
     * 按规则生成路径
     * @param $catalogPath [uri使用相对路径,生成文件用物理路径]
     * @param $rule [列表路径规则]
     * @param $cid [栏目id]
     * @param $tid [分类id]
     * @param $page [第几页]
     * @return mixed
     * @throws \Exception
     */
    public static function getRulePath($catalogPath, $rule, $cid, $tid, $page = 1)
    {
        if (empty($rule)) {
            throw new \Exception("null articlesRule error");
        }
        $rule = replaceDS($rule);//处理分隔符
        $search = ["{cpath}", "{cid}", "{tid}", "{page}", "{tpath}"];
        $replace = [
            PathHelper::getDir($catalogPath),
            $cid,
            $tid,
            $page,
            $tid && ifContain($rule, "{tpath}") ? self::get($tid)->tpath() : "",
        ];
        $rulePath = replaceDS(str_replace($search, $replace, $rule));

        if (ifContain($catalogPath, Templet::getRootDir())) {
            //生成操作时,处理路径不在根目录里的
            if (!ifContain($rulePath, Templet::getRootDir()))
                $rulePath = Templet::getRootDir() . deleteStartDS($rulePath);
        } else {
            //获取URI时,处理路径{aid}.html
            $rulePath = appendStartDS($rulePath);
        }
        return $rulePath;
    }

    /**
     * 获取分类uri
     * @param int $catalogId [分类设置了多个栏目时，默认选择首个栏目]
     * @return mixed
     * @throws \Exception
     */
    public function getUri($catalogId = 0)
    {
        $catalogs = $this->catalogs;
        if (!$catalogs) {
            throw new \Exception("分类{$this->id}找不到对应的栏目");
        }
        $catalog = $catalogs[0];
        if (count($catalogs) > 0) {
            foreach ($catalogs as $catalog_) {
                if ($catalog_->id == $catalogId)
                    $catalog = $catalog_;
            }
        }
        return replaceUrlDS(self::getRulePath($catalog->getUri(), $catalog->articlelist_rule, $catalog->id, $this->id));
    }

    /**
     * 分类设置了多个栏目时，通过指定路径获取uri
     * @param string $path_pattern
     * @return mixed|string
     */
    public function getUriByPattern($path_pattern = "/m/")
    {
        $catalogs = $this->catalogs;
        foreach ($catalogs as $catalog) {
            if (ifContain($catalog->path, $path_pattern)) {
                return $this->getUri($catalog->id);
            }
        }
        return $this->getUri();
    }

    /**
     * 获取多个栏目属性集合
     */
    public function getCatalogValues($field = "title")
    {
        $catalogs = $this->catalogs;
        if ($catalogs) {
            $name = [];
            foreach ($catalogs as $catalog) {
                $name[] = $catalog->getData($field);
            }
            return implode(',', $name);
        }
        return "";
    }


    //获取一个栏目
    public function getFirstCatalog()
    {
        $catalogs = $this->catalogs;
        if (empty($catalogs)) {
            throw new \Exception("分类{$this->id}找不到对应的栏目");
        }
        //有多个栏目时，默认第一个栏目，排序最大的
        return $catalogs[0];
    }


    //关联文章
    public function articles()
    {
        return $this->hasMany('Article')->where('status', Article::STATUS_OPEN);
    }

    //关联栏目
    public function catalogs()
    {
        return $this->belongsToMany('Catalog', 'app\common\model\CateCatalog')->order("sort desc,id");
    }
}
