<?php

/**
 * 微信管理
 */

namespace Module\Admin;

use Pyramid\Component\HttpFoundation\Response;
use Pyramid\Component\HttpFoundation\RedirectResponse;
use Pyramid\Component\WeChat\WeChat;
use Exception;

trait WxAdmin {
    
    
    /**
     * home
     * @access wxadmin
     * @route /admin/wxadmin
     */
    public static function wxadminHome($request) {
        return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'));
    }

    
    /**
     * history
     * @access wxadmin
     * @route /admin/wxadmin/menu/history
     */
    public static function wxadminMenuHistory($request) {
        $data = db_query("select * from {wxmenu} order by id desc")->fetchAll();
        return new Response(render('/admin/wxmenu.history.html', array(
            'data' => $data,
        )));
    }
    
    /**
     * history
     * @access wxadmin
     * @route /admin/wxadmin/menu/history/{id}
     */
    public static function wxadminMenuHistoryEdit($request) {
        $id = $request->route->getParameter('id');
        $wxmenu = db_query("select * from {wxmenu} where id=:id", array(':id'=>$id))->fetchObject();
        if (!$wxmenu) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/menu/history'));
        }
        $json = json_decode($wxmenu->orig ?: '[]', true);
        $data = $json ?: array();
        return new Response(render('/admin/wxmenu.edit.html', array(
            'data' => $data,
            'wxmenu' => $wxmenu,
        )));
    }

    /**
     * edit
     * @access wxadmin
     * @route /admin/wxadmin/menu
     * @route /admin/wxadmin/menu/edit
     */
    public static function wxadminEditMenu($request) {
        $wechat = new WeChat(config()->get('wechat'));
        $json = $wechat->getMenu();
        $data = !empty($json['menu']['button']) ? $json['menu']['button'] : array();
        return new Response(render('/admin/wxmenu.edit.html', array(
            'data' => $data,
        )));
    }
    
    /**
     * Submit
     * @access wxadmin
     * @route /admin/wxadmin/menu/submit
     */
    public static function wxadminSubmitMenu($request) {
        $names = $request->getParameter('names');
        $types = $request->getParameter('types');
        $urls  = $request->getParameter('urls');
        $note  = $request->getParameter('note', '');
        $json  = $request->getParameter('serializevalue');
        if ($data = json_decode($json, true)) {
            $menu = self::wxadminMakeButtons($data, $names, $types, $urls);
            self::wxadminSyncMenu($request, $menu, $note);
        }
        return new RedirectResponse($request->getUriForPath('/admin/wxadmin/menu/edit'), 3, '提交成功,3秒后自动返回');
    }
    
    //解析菜单
    protected static function wxadminMakeButtons($array, $names, $types, $urls) {
        $buttons = array();
        foreach ($array as $v) {
            $id = isset($v['id']) ? $v['id'] : 0;
            if (!$id || empty($names[$id])) { continue; }
            $button = array(
                'name'  => $names[$id],
                'sub_button' => array(),
            );
            $type = isset($types[$id]) ? $types[$id] : 'click';
            if ($type == 'view') {
                $button['type'] = $type;
                $button['url']  = $urls[$id];
            } elseif ($type == 'miniprogram') {
                $button['type'] = $type;
                list($url,$appid,$pagepath) = explode('|', $urls[$id]);
                $button['url'] = $url;
                $button['appid'] = $appid;
                $button['pagepath'] = $pagepath ? $pagepath : 'pages/index/index';
            } else {
                $button['type'] = 'click';
                $button['key']  = $urls[$id] ?: md5(microtime());
            }
            if (!empty($v['children'])) {
                if ($button['sub_button'] = self::wxadminMakeButtons($v['children'], $names, $types, $urls)) {
                    unset($button['type'], $button['key'], $button['url']);
                }
            }
            $buttons[] = $button;
        }
        return $buttons;
    }
    
    //提交微信菜单
    protected static function wxadminSyncMenu($request, $data, $note) {
        $wechat = new WeChat(config()->get('wechat'));
        $json = $wechat->getMenu();
        $orig = !empty($json['menu']['button']) ? $json['menu']['button'] : array();
        db_insert('wxmenu')
            ->fields(array(
                'orig'  => json_encode($orig),
                'data'  => json_encode($data),
                'note'  => (string) $note,
                'created' => time(),
            ))
            ->execute();
        return $wechat->setMenu(array('button'=>$data));
    }

    
    /**
     * 列表
     * @access wxadmin
     * @route /admin/wxadmin/source
     */
    public static function wxadminSource($request) {
        $page = $request->getParameter('page');
        $query = db_select('wxsource', 'w')->extend('Pager')->size(32)->page($page);
        $query->fields('w', array('id'))->condition('status', 1);
        $ids   = $query->execute()->fetchCol();
        $pager = $query->fetchPager();
        $data  = entity_load('wxsource', $ids);
        return new Response(render('/admin/wxsource.list.html', array(
            'pager' => $pager,
            'data'  => $data,
        )));
    }
    
    /**
     * 添加
     * @access wxadmin
     * @route /admin/wxadmin/source/add/{types}
     */
    public static function wxadminSourceAdd($request) {
        if ($request->post->getParameters()) {
            $data = (object) $request->post->getParameters();
            $data->created = $data->updated = time();
            if ($data->types == 'image') {
                $wechat = new WeChat(config()->get('wechat'));
                $json = $wechat->uploadMaterialFile('image', config()->get('webRoot') . $data->picture);
                if ($json) {
                    $data->content = json_encode($json);
                }
            }
            try {
                entity_insert('wxsource', $data);
                return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 1, '添加成功');
            } catch (Exception $e) {
                return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 4, $e->getMessage());
            }
        }
        $types = $request->route->getParameter('types');
        return new Response(render('/admin/wxsource.add.html', array(
            'types' => $types,
            
        )));
    }
    
    /**
     * 修改
     * @access wxadmin
     * @route /admin/wxadmin/source/edit/{id}
     */
    public static function wxadminSourceEdit($request) {
        $id = $request->route->getParameter('id');
        if (!$id) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 4, '无此记录');
        }
        if (!$data = entity_object('wxsource', $id)) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 4, '无此记录');
        }
        if ($request->post->getParameters()) {
            $post = (object) $request->post->getParameters();
            $post->id = $id;
            $post->updated = time();
            if ($post->types == 'image' && $post->picture != $data->picture) {
                $wechat = new WeChat(config()->get('wechat'));
                $json = $wechat->uploadMaterialFile('image', config()->get('webRoot') . $post->picture);
                if ($json) {
                    $post->content = json_encode($json);
                }
            }
            try {
                entity_update('wxsource', $post);
                return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 1, '更新成功');
            } catch (Exception $e) {
                return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 4, $e->getMessage());
            }
        }
        return new Response(render('/admin/wxsource.edit.html', array(
            'data' => $data,
        )));
    }

    /**
     * 删除
     * @access wxadmin
     * @route /admin/wxadmin/source/delete/{id}
     */
    public static function wxadminSourceDelete($request) {
        validateRequestToken($request, 600);
        $id = $request->route->getParameter('id');
        if (!$id) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 4, '无此记录');
        }
        if (!$data = entity_object('wxsource', $id)) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 4, '无此记录');
        }
        $dataUpdate = (object) array('id'=>$data->id,'status'=>0);
        entity_update('wxsource', $dataUpdate);            
        return new RedirectResponse($request->getUriForPath('/admin/wxadmin/source'), 1, '操作成功');
    }

    
    /**
     * 列表
     * @access wxadmin
     * @route /admin/wxadmin/keyword
     */
    public static function wxadminKeyword($request) {
        $page = $request->getParameter('page');
        $data  = db_query("select * from {wxkeyword}")->fetchAll();
        return new Response(render('/admin/wxkeyword.list.html', array(
            'data'  => $data,
        )));
    }
    
    /**
     * 添加
     * @access wxadmin
     * @route /admin/wxadmin/keyword/add
     */
    public static function wxadminKeywordAdd($request) {
        if ($request->post->getParameters()) {
            $data = (object) $request->post->getParameters();
            $data->keyword = strtolower(trim($data->keyword));
            $data->sources = str_replace(' ', '', trim($data->sources));
            $exists = db_query("select * from {wxkeyword} where keyword=:k", array(':k'=>$data->keyword))->fetchObject();
            if ($exists) {
                db_update('wxkeyword')
                    ->fields(array('sources' => $data->sources))
                    ->condition('id', $exists->id)
                    ->execute();
            } else {
                db_insert('wxkeyword')
                    ->fields(array(
                        'keyword' => $data->keyword,
                        'sources' => $data->sources,
                    ))
                    ->execute();
            }
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 1, '操作成功');
        }
        return new Response(render('/admin/wxkeyword.add.html'));
    }
    
    /**
     * 修改
     * @access wxadmin
     * @route /admin/wxadmin/keyword/edit/{id}
     */
    public static function wxadminKeywordEdit($request) {
        $id = $request->route->getParameter('id');
        if (!$id) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 4, '无此记录');
        }
        if (!$data = db_query("select * from {wxkeyword} where id=:id", array(':id'=>$id))->fetchObject()) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 4, '无此记录');
        }
        if ($request->post->getParameters()) {
            $data = (object) $request->post->getParameters();
            $data->sources = str_replace(' ', '', trim($data->sources));
            db_update('wxkeyword')
                ->fields(array('sources' => $data->sources))
                ->condition('id', $id)
                ->execute();
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 1, '操作成功');
        }
        return new Response(render('/admin/wxkeyword.edit.html', array(
            'data' => $data,
        )));
    }

    /**
     * 删除
     * @access wxadmin
     * @route /admin/wxadmin/keyword/delete/{id}
     */
    public static function wxadminKeywordDelete($request) {
        validateRequestToken($request, 600);
        $id = $request->route->getParameter('id');
        if (!$id) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 4, '无此记录');
        }
        if (!$data = db_query("select * from {wxkeyword} where id=:id", array(':id'=>$id))->fetchObject()) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 4, '无此记录');
        }
        if ($data->locked) {
            return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 4, '无法删除预保留的数据');
        }
        db_delete("wxkeyword")->condition("id", $id)->execute();
        return new RedirectResponse($request->getUriForPath('/admin/wxadmin/keyword'), 1, '操作成功');
    }

}
