<?php

/**
 * 配置管理
 */

namespace Module\Admin;

use Pyramid\Component\HttpFoundation\Response;
use Pyramid\Component\HttpFoundation\RedirectResponse;
use Pyramid\Component\Permission\Permission;
use Pyramid\Component\Route\Route;

trait Setting {

    /**
     * 管理员列表
     * @route /admin/setting
     * @route /admin/setting/user
     * @access administrator
     */
    public static function settingUsers($request) {
        $page = $request->getParameter('page');
        $query = db_select('sys_user', 'u')
                    ->extend('Pager')->size(20)->page($page)
                    ->condition('uid', 1, '>')
                    ->fields('u', array('uid'))
                    ->orderBy('uid', 'DESC');
        $uids  = $query->execute()->fetchCol();
        $pager = $query->fetchPager();
        $data  = entity('user')->load($uids);
        return new Response(render('/admin/setting.users.html', array(
            'pager' => $pager,
            'data'  => $data,
        )));
    }
    
    /**
     * 管理员添加
     * @route /admin/setting/user/add
     * @access administrator
     */
    public static function settingUserAdd($request) {
        if ($request->post->getParameters()) {
            $user = (object) $request->post->getParameters();
            $user->created = $user->updated = time();
            $user->uuid = uuid();
            foreach (array('username', 'password') as $key) {
                if (empty($user->$key)) {
                    return new RedirectResponse($request->getUriForPath('/admin/setting/user/add'), 3, '用户已存在或信息输入不完整');
                }
            }
            if ($user->password != $user->cfmpassword) {
                return new RedirectResponse($request->getUriForPath('/admin/setting/user/add'), 3, '两次输入密码不一致');
            }
            if ($exists = db_select('sys_user', 'u')
                            ->fields('u')
                            ->condition('username', $user->username)
                            ->execute()
                            ->fetchObject()) {
                return new RedirectResponse($request->getUriForPath('/admin/setting/user/add'), 3, '用户已经存在');
            }
            $user->password = pyramid_password_hash($user->password);
            entity_insert('user', $user);
            return new RedirectResponse($request->getUriForPath('/admin/setting/user'), 1, '操作成功');
        }
        return new Response(render('/admin/setting.user.add.html', array(
            'roles' => db_query("select rid,name from {sys_role} order by weight")->fetchAllKeyed(),
            'permissions' => self::getRegistedPermissions(),
            'sexes' => config()->get('sexes'),
        )));
    }

    /**
     * 管理员修改
     * @route /admin/setting/user/edit/{uid}
     * @access administrator
     */
    public static function settingUserEdit($request) {
        $uid = $request->route->getParameter('uid');
        if (!$uid) {
            return new RedirectResponse($request->getUriForPath('/admin/setting/user'), 4, '管理员-无此记录');
        }
        if (!$user = entity_object('user', $uid)) {
            return new RedirectResponse($request->getUriForPath('/admin/setting/user'), 4, '管理员-无此记录');
        }
        if ($request->post->getParameters()) {
            $user = (object) $request->post->getParameters();
            $user->uid = $uid;
            $user->updated = time();
            unset($user->username, $user->uuid, $user->created);
            if (empty($user->roles)) {
                $user->roles = array();
            }
            if (empty($user->field_permission)) {
                $user->field_permission = array();
            }
            if (!empty($user->password)) {
                if ($user->password != $user->cfmpassword) {
                    return new RedirectResponse($request->getUriForPath('/admin/setting/user/edit/'.$uid), 3, '两次输入密码不一致');
                }
                $user->password = pyramid_password_hash($user->password);
            } else {
                unset($user->password);
            }
            entity_update('user', $user);
            return new RedirectResponse($request->getUriForPath('/admin/setting/user'), 1, '操作成功');
        }
        return new Response(render('/admin/setting.user.edit.html', array(
            'data' => $user,
            'roles' => db_query("select rid,name from {sys_role} order by weight")->fetchAllKeyed(),
            'permissions' => self::getRegistedPermissions(),
            'sexes' => config()->get('sexes'),
        )));
    }

    /**
     * 角色配置
     * @route /admin/setting/role
     * @access administrator
     */
    public static function settingRole($request) {
        $roles = db_query("select * from {sys_role} order by weight")->fetchAll();
        return new Response(render('/admin/setting.role.html', array(
            'data'  => $roles,
            'admin' => $request->getParameter('admin'),
        )));
    }
    
    /**
     * 角色添加
     * @route /admin/setting/role/add
     * @access administrator
     */
    public static function settingRoleAdd($request) {
        if ($request->post->getParameters()) {
            $role = (object) $request->post->getParameters();
            entity_insert('role', $role);
            return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 1, '操作成功');
        }
        return new Response(render('/admin/setting.role.add.html', array(
            'permissions' => self::getRegistedPermissions(),
        )));
    }
    
    /**
     * 角色修改
     * @route /admin/setting/role/edit/{rid}
     * @access administrator
     */
    public static function settingRoleEdit($request) {
        $rid = $request->route->getParameter('rid');
        if (!$rid) {
            return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 4, '角色-无此记录');
        }
        if (!$role = entity_object('role', $rid)) {
            return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 4, '角色-无此记录');
        }
        if ($role->locked) {
            user_access('root', $request->getParameter('admin'));
        }
        if ($request->post->getParameters()) {
            $role = (object) $request->post->getParameters();
            $role->rid = $rid;
            entity_update('role', $role);
            return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 1, '操作成功');
        }
        $perms = pyramid_array_column($role->field_permission, 'permission');
        $role->permissions = array_combine($perms, $perms);
        return new Response(render('/admin/setting.role.edit.html', array(
            'data' => $role,
            'permissions' => self::getRegistedPermissions(),
        )));
    }
    
    /**
     * 角色删除
     * @route /admin/setting/role/delete/{rid}
     * @access administrator
     */
    public static function settingRoleDelete($request) {
        validateRequestToken($request, 600);
        $rid = $request->route->getParameter('rid');
        if (!$rid) {
            return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 4, '角色-无此记录');
        }
        if (!$role = entity_object('role', $rid)) {
            return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 4, '角色-无此记录');
        }
        if ($role->locked) {
            user_access('root', $request->getParameter('admin'));
        }
        entity_delete('role', $rid);
        return new RedirectResponse($request->getUriForPath('/admin/setting/role'), 2, '角色-操作成功');
    }

    /**
     * 语种管理
     * @route /admin/setting/language
     * @access administrator
     */
    public static function settingLanguage($request) {
        $langs = config()->get('langs');
        //有数据提交,表示提交翻译
        if ($request->post->getParameters()) {
            $lang = $request->getParameter('lang');
            $langset = (array) $request->getParameter('langset', array());
            if (isset($langs[$lang])) {
                foreach($langset as $id=>$value) {
                    db_update('language')
                        ->fields(array('value' => $value))
                        ->condition('id', $id)
                        ->execute();
                }
            }
            return new RedirectResponse($request->getUriForPath('/admin/setting/language'), 2, '操作成功');
        }
        //显示语种所有词
        $lang = $request->getParameter('language', 'zhCN');
        if (!isset($langs[$lang])) {
            $lang = 'zhCN';
        }
        $data = db_query("select * from {language} where language=:l", array(':l'=>$lang))->fetchAll();
        return new Response(render('/admin/setting.language.html', array(
            'thislang' => $lang,
            'data' => $data,
        )));
    }
    
    //获取权限清单
    protected static function getRegistedPermissions() {
        $permissions = Permission::get();
        $routes = Route::get();
        foreach ($routes as $weight=>$list) {
            foreach ($list as $route=>$info) {
                if (!empty($info['access'])) {
                    foreach ($info['access'] as $permission) {
                        if (!isset($permissions[$permission])) {
                            $permissions[$permission] = array(
                                'bundle'        => '',
                                'title'         => $permission,
                                'description'   => $permission,
                                'routes'        => array($route),
                            );
                        } else {
                            $permissions[$permission]['routes'][] = $route;
                        }
                    }
                }
            }
        }
        return $permissions;
    }

}