<?php
/**
 * The control file of tree module of XXB.
 *
 * @copyright   Copyright 2009-2023 禅道软件（青岛）有限公司(ZenTao Software (Qingdao) Co., Ltd., www.zentao.net)
 * @license     ZOSL (https://zpl.pub/page/zoslv1.html)
 * @author      Chunsheng Wang <chunsheng@cnezsoft.com>
 * @package     tree
 * @version     $Id: control.php 4145 2016-10-14 05:31:16Z liugang $
 * @link        https://xuanim.com
 */
class tree extends control
{
    const NEW_CHILD_COUNT = 5;

    /**
     * Browse the categories and print manage links.
     *
     * @param  string $type
     * @param  int    $startModule
     * @param  int    $root
     * @param  string $from
     * @access public
     * @return void
     */
    public function browse($type = 'dept', $startModule = 0, $root = 0, $from = '')
    {
        $this->view->title      = $this->lang->tree->browse;
        $this->view->position[] = $this->lang->tree->browse;

        $this->view->type       = $type;
        $this->view->root       = $root;
        $this->view->moduleID   = $startModule;
        $this->view->treeMenu   = $this->tree->getTreeMenu($type, 0, array('treeModel', 'createManageLink'), $root);

        $this->display();
    }

    /**
     * Edit a category.
     *
     * @param  int      $categoryID
     * @access public
     * @return void
     */
    public function edit($categoryID)
    {
        /* Get current category. */
        $category = $this->tree->getById($categoryID);

        if($category->type == 'dept')
        {
            $this->app->loadLang('user');
            $this->lang->category = $this->lang->dept;
        }

        if(!empty($_POST))
        {
            $result = $this->tree->update($categoryID);
            $comment = json_encode($_POST);
            if($result)
            {
                $this->tree->addTreeAction($categoryID, 'edit', 'success', $comment);
                $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
            }
            $this->tree->addTreeAction($categoryID, 'edit', 'fail', $comment);
            $this->send(array('result' => 'fail', 'message' => dao::isError() ? dao::getError() : $result));
        }

        /* Get option menu and remove the families of current category from it. */
        $optionMenu = $this->tree->getOptionMenu($category->type, 0, false, $category->root);
        $families   = $this->tree->getFamily($categoryID, $category->type, $category->root);
        foreach($families as $member) unset($optionMenu[$member]);

        /* Assign. */
        $this->view->category   = $category;
        $this->view->optionMenu = $optionMenu;
        $this->view->aliasAddon = trim("http://" . $this->server->http_host . $this->config->webRoot, '/' ). '/';

        if(strpos('forum,blog', $category->type) !== false) $this->view->aliasAddon .=  $category->type . '/';

        if($category->type == 'dept' or $category->type == 'forum' or $category->type == 'blog') $this->view->users = $this->loadModel('user')->getPairs('nodeleted,nodeleted,noclosed');

        $groups = $this->loadModel('group')->getPairs();
        $this->view->groups = $groups;

        /* remove left menu. */
        unset($this->lang->tree->menu);

        $this->display();
    }

    /**
     * Manage children.
     *
     * @param  string    $type
     * @param  int       $category    the current category id.
     * @param  int       $root
     * @access public
     * @return void
     */
    public function children($type, $category = 0, $root = 0)
    {
        if($type == 'dept')
        {
            $this->app->loadLang('user');
            $this->lang->category = $this->lang->dept;
        }

        if(!empty($_POST))
        {
            $result          = $this->tree->manageChildren($type, $this->post->parent, $this->post->children, $root);
            $locate          = $this->inLink('browse', "type=$type&category={$this->post->parent}&root=$root");
            $comment         = $_POST;
            $comment['root'] = $root;
            $comment = json_encode($comment);
            if($result)
            {
                $this->tree->addTreeAction($category, 'manageChildren', 'success', $comment);
                $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
            }
            $this->tree->addTreeAction($category, 'manageChildren', 'fail', $comment);
            $this->send(array('result' => 'fail', 'message' => dao::isError() ? dao::getError() : $result));
        }

        $this->view->title    = $this->lang->tree->manage;
        $this->view->type     = $type;
        $this->view->root     = $root;
        $this->view->children = $this->tree->getChildren($category, $type, $root);
        $this->view->origins  = $this->tree->getOrigin($category);
        $this->view->parent   = $category;

        $this->display();
    }

    /**
     * Delete a category.
     *
     * @param  int    $categoryID
     * @access public
     * @return void
     */
    public function delete($categoryID)
    {
        /* If type is 'forum' and has children, warning. */
        $category = $this->tree->getByID($categoryID);
        if($category->major) return false;

        $children = $this->tree->getChildren($categoryID, $category->type);
        if($children)
        {
            $this->tree->addTreeAction($categoryID, 'delete', 'fail');
            $this->send(array('result' => 'fail', 'message' => $this->lang->tree->hasChildren));
        }

        if($this->tree->delete($categoryID))
        {
            $this->tree->addTreeAction($categoryID, 'delete', 'success');
            $this->send(array('result' => 'success'));
        }
        $this->tree->addTreeAction($categoryID, 'delete', 'fail');
        $this->send(array('result' => 'fail', 'message' => dao::getError()));
    }
}
