<?php

/**
 * 微信用户管理
 */

namespace Module\Admin;

use Pyramid\Component\HttpFoundation\Response;
use Pyramid\Component\HttpFoundation\RedirectResponse;
use Pyramid\Component\WeChat\WeChat;
use Exception;

trait WxUser {
    
    /**
     * 微信用户
     * @access wxuser
     * @route /admin/wxuser
     * @route /admin/wxuser/list
     * @route /admin/wxuser/list/subscribed
     * @route /admin/wxuser/list/unsubscribed
     */
    public static function wxuser($request) {
        $page = $request->getParameter('page');
        $query = db_select('wxuser', 'w')
                    ->extend('Pager')->size(20)->page($page)
                    ->fields('w')
                    ->orderBy('uid', 'DESC');
        if ($request->route->getParameter(3) == 'subscribed') {
            $query->condition('subscribe', 1);
        } elseif ($request->route->getParameter(3) == 'unsubscribed') {
            $query->condition('subscribe', 0);
        }
        $data  = $query->execute()->fetchAll();
        $pager = $query->fetchPager();
        return new Response(render('/admin/wxuser.list.html', array(
            'sexes' => config()->get('sexes'),
            'pager' => $pager,
            'data'  => $data,
        )));
    }
    
    /**
     * 微信活跃用户
     * @access wxuser
     * @route /admin/wxuser/actived
     */
    public static function wxuserActived($request) {
        $page = $request->getParameter('page');
        $query = db_select('wxuser', 'w')
                    ->extend('Pager')->size(20)->page($page)
                    ->fields('w')
                    ->condition('subscribe', 1)
                    ->condition('accessed', time()-172800, '>')
                    ->orderBy('accessed', 'DESC');
        $data  = $query->execute()->fetchAll();
        $pager = $query->fetchPager();
        return new Response(render('/admin/wxuser.actived.html', array(
            'sexes' => config()->get('sexes'),
            'pager' => $pager,
            'data'  => $data,
        )));
    }

    /**
     * 信息历史
     * @access wxuser
     * @route /admin/wxuser/message
     */
    public static function wxuserMessage($request) {
        $page = $request->getParameter('page');
        $query = db_select('wxuser_message', 'm')
                    ->extend('Pager')->size(32)->page($page)
                    ->leftJoin('wxuser', 'u', 'u.openid = m.openid')
                    ->fields('u')
                    ->fields('m')
                    ->orderBy('m.id', 'DESC');
        $data  = $query->execute()->fetchAll();
        $pager = $query->fetchPager();
        foreach ($data as $v) {
            $v->data = $v->data ? json_decode($v->data,true) : array();
        }
        return new Response(render('/admin/wxuser.message.html', array(
            'sexes' => config()->get('sexes'),
            'types' => array(
                'receive'=>'<span class="label label-success">收到消息</span>',
                'reply'=>'<span class="label label-danger">被动回复</span>',
                'push'=>'<span class="label label-danger">主动推送</span>',
            ),
            'pager' => $pager,
            'data'  => $data,
        )));
    }
    
    /**
     * 信息历史筛选
     * @access wxuser
     * @route /admin/wxuser/message/{subtype}
     */
    public static function wxuserMessageSubtype($request) {
        $subtype = $request->route->getParameter('subtype');
        $page = $request->getParameter('page');
        $query = db_select('wxuser_message', 'm')
                    ->extend('Pager')->size(32)->page($page)
                    ->leftJoin('wxuser', 'u', 'u.openid = m.openid')
                    ->fields('u')
                    ->fields('m')
                    ->condition('m.subtype', $subtype)
                    ->orderBy('m.id', 'DESC');
        $data  = $query->execute()->fetchAll();
        $pager = $query->fetchPager();
        foreach ($data as $v) {
            $v->data = $v->data ? json_decode($v->data,true) : array();
        }
        return new Response(render('/admin/wxuser.message.html', array(
            'sexes' => config()->get('sexes'),
            'types' => array(
                'receive'=>'<span class="label label-success">收到消息</span>',
                'reply'=>'<span class="label label-danger">被动回复</span>',
                'push'=>'<span class="label label-danger">主动推送</span>',
            ),
            'pager' => $pager,
            'data'  => $data,
        )));
    }
    
    /**
     * 留言管理
     * @access wxuser
     * @route /admin/wxmessage/feedback
     */
    public static function wxuserMessageFeedback($request) {
        $page = $request->getParameter('page');
        $query = db_select('wxuser_message', 'm')
                    ->extend('Pager')->size(32)->page($page)
                    ->leftJoin('wxuser', 'u', 'u.openid = m.openid')
                    ->fields('u')
                    ->fields('m')
                    ->condition('m.subtype', array('text','image', 'location', 'link'))
                    ->orderBy('m.id', 'DESC');
        $data  = $query->execute()->fetchAll();
        $pager = $query->fetchPager();
        foreach ($data as $v) {
            $v->data = $v->data ? json_decode($v->data,true) : array();
        }
        return new Response(render('/admin/wxuser.message.feedback.html', array(
            'sexes' => config()->get('sexes'),
            'types' => array(
                'receive'=>'<span class="label label-success">收到消息</span>',
                'reply'=>'<span class="label label-danger">被动回复</span>',
                'push'=>'<span class="label label-danger">主动推送</span>',
            ),
            'pager' => $pager,
            'data'  => $data,
        )));
    }

    /**
     * 发送客服消息
     * @access wxuser_sendmessage
     * @route /admin/wxuser/sendmessage
     */
    public static function wxuserSendMessage($request) {
        $msg = $request->getParameter('msg');
        $uid = $request->getParameter('uid');
        $openid = $request->getParameter('openid');
        $user = db_query("select * from {wxuser} where uid=:uid limit 1", array(':uid'=>$uid))->fetchObject();
        if (!$user || $user->openid != $openid) {
            return new Response('用户异常', 406);
        }
        $wechat = new WeChat(config()->get('wechat'));
        $result = $wechat->sendCustomMessage(array(
                    'touser'  => $openid,
                    'msgtype' => 'text',
                    'text'    => array(
                       'content' => $msg,
                    ),
                  ));
        if ($result) {
            db_insert('wxuser_message')
                ->fields(array(
                    'openid'    => $openid,
                    'timestamp' => time(),
                    'type'      => 'push',
                    'msgtype'   => 'text',
                    'subtype'   => 'text',
                    'data'      => json_encode(array('Content'=>$msg, 'content'=>$msg)),
                ))
                ->execute();
        }
        return new Response($result, $result?200:406);
    }

    /**
     * 更新全部关注微信用户信息
     * @access wxuser
     * @route /admin/wxuser/batupdate
     */
    public static function wxuserBatUpdate($request) {
        set_time_limit(7200);
        ignore_user_abort(true);
        $wechat = new WeChat(config()->get('wechat'));
        $nextid = $request->getParameter('nextid', '');
        $path   = $request->route->get('path');
        self::syncWechatUser($nextid);
        return new RedirectResponse($request->getUriForPath('/admin/wxuser'), 3, '微信用户信息更新完毕');
    }
    
    //执行用户更新
    protected static function syncWechatUser($nextid = '') {
        $wechat = new WeChat(config()->get('wechat'));
        if ($json = $wechat->getUserList($nextid)) {
            if ($json['count'] <= 0) { return ; }
            foreach (array_chunk($json['data']['openid'], 100) as $openids) {
                if ($users = $wechat->getUserInfoBatch($openids)) {
                    foreach ($users['user_info_list'] as $uinfo) {
                        entity('wxuser')->merge((object) $uinfo, array('openid'=>$uinfo['openid']));
                    }
                }
            }
            if (!empty($json['next_openid'])) {
                self::syncWechatUser($json['next_openid']);
            }
        }
    }

}