<?php namespace Phpcmf\Controllers\Admin;

class Template extends \Phpcmf\Table
{

    public function __construct()
    {
        parent::__construct();
        // 表单显示名称
        $this->name = dr_lang('模板消息');
        // 模板前缀(避免混淆)
        $this->tpl_prefix = 'template_';
        // 用于表储存的字段，后台可修改的表字段
        $field = array(
            'title' => array(
                'name' => dr_lang('主题'),
                'fieldname' => 'title', // 这是字段名称必须和主键相同
            ),
            'template' => array(
                'name' => dr_lang('模板ID'),
                'fieldname' => 'template', // 这是字段名称必须和主键相同
            ),
            'url' => array(
                'name' => dr_lang('消息URL'),
                'fieldname' => 'url', // 这是字段名称必须和主键相同
            ),
        );
        // 初始化数据表
        $this->_init([
            'table' => weixin_wxtable('template'),
            'field' => $field, // 可查询的字段
            'order_by' => 'inputtime desc', // 列表排序
            'date_field' => 'inputtime', // 按时间段搜索字段
        ]);

        // 把公共变量传入模板
        \Phpcmf\Service::V()->assign([
            // 搜索字段
            'field' => $field,
            // 后台的菜单
            'menu' => \Phpcmf\Service::M('auth')->_admin_menu(
                [
                    WEIXIN_MORE_NAME. $this->name => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-edit'],
                    '创建' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/add', 'fa fa-plus'],
                    '修改' => ['hide:'.APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/edit', 'fa fa-edit'],
                ]),
            'group' => \Phpcmf\Service::M('User', APP_DIR)->get_group_data(),
            'ucount' => \Phpcmf\Service::M()->table(weixin_wxtable('user'))->counts(),
        ]);
    }

    // 来自cms的群发
    public function show_add() {

        $id = (int)\Phpcmf\Service::L('Input')->get('id');
        $mid = dr_safe_filename(\Phpcmf\Service::L('Input')->get('mid'));
        if (!$id || !$mid) {
            $this->_json(0, '参数不能为空');
        }

        $data = \Phpcmf\Service::M()->table_site($mid)->get($id);
        if (!$data) {
            $this->_json(0, '内容不存在');
        }

        $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll();
        if (!$cache) {
            $this->_json(0, dr_lang('没有可用粉丝'));
        }

        $tpl = [];


        // 生成模板
        $template = [];
        foreach ($tpl['content'] as $t) {
            if ($t['name']) {
                $template[$t['name']] = [
                    'value' => $t['value'],
                    'color' => $t['color'],
                ];
            }
        }
        if (!$template) {
            $this->_json(0, dr_lang('模板内容解析后不存在'));
        }

        // 存储文件
        \Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [
            'data' => $data,
            'template' => $template,
            'users' => dr_save_bfb_data($cache)
        ], 3600);


        $this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]);
    }

    // 查看列表
    public function index() {
        list($tpl) = $this->_List();
        \Phpcmf\Service::V()->display($tpl);
    }

    // 添加内容
    public function add() {
        list($tpl) =$this->_Post(0);
        \Phpcmf\Service::V()->display($tpl);
    }

    // 修改内容
    public function edit() {

        $id = intval(\Phpcmf\Service::L('Input')->get('id'));
        list($tpl) = $this->_Post($id);
        \Phpcmf\Service::V()->display($tpl);
    }

    // 删除内容
    public function del() {
        $this->_Del(
            \Phpcmf\Service::L('Input')->get_post_ids(),
            null,
            null,
            \Phpcmf\Service::M()->dbprefix($this->init['table'])
        );
    }

    // 内容处理
    public function todo_add() {

        $id = \Phpcmf\Service::L('input')->get('id');
        $data = \Phpcmf\Service::M()->table($this->init['table'])->get($id);
        if (!$data) {
            $this->_json(0, dr_lang('模板内容不存在'));
        } elseif (!$data['content']) {
            $this->_json(0, dr_lang('内容参数不存在'));
        } elseif (!$data['template']) {
            $this->_json(0, dr_lang('模板ID不存在'));
        }

        $data['content'] = dr_string2array($data['content']);
        if ($data['groupid'] < 0) {
            $gid = abs($data['groupid']);
            $where = 'uid in (select uid from '.\Phpcmf\Service::M()->dbprefix('member_group_index').' where gid='.$gid.')';
            $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where($where)->getAll();
        } elseif ($data['groupid'] > 0) {
            $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where('groupids LIKE "%\"'.\Phpcmf\Service::M()->db->escapeString($data['groupid'], true).'\"%"')->getAll();
        } else {
            $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll();
        }
        if (!$cache) {
            $this->_json(0, dr_lang('没有可用粉丝'));
        }

        // 生成模板
        $template = [];
        foreach ($data['content'] as $t) {
            if ($t['name']) {
                $template[$t['name']] = [
                    'value' => $t['value'],
                    'color' => $t['color'],
                ];
            }
        }
        if (!$template) {
            $this->_json(0, dr_lang('模板内容解析后不存在'));
        }


        // 存储文件
        \Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [
            'data' => $data,
            'template' => $template,
            'users' => $this->_save_bfb_data($cache),
        ]);

        $this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]);
    }

    function _save_bfb_data($data) {

        $cache = [];
        $count = dr_count($data);
        $num = ceil($count/10);
        if ($count > $num) {
            $pagesize = ceil($count/$num);
            for ($i = 1; $i <= $num; $i ++) {
                $cache[$i] = array_slice($data, ($i - 1) * $pagesize, $pagesize);
            }
        } else {
            for ($i = 1; $i <= $count; $i ++) {
                $cache[$i] = array_slice($data, ($i - 1), 1);
            }
        }

        return $cache;
    }


    // 内容处理
    public function show_index() {
        \Phpcmf\Service::V()->assign([
            'menu' => '',
            'hidebtn' => 1,
            'todo_url' =>  dr_url('weixin/template/send_add'),
            'count_url' =>  dr_url('weixin/template/show_count_index'),
        ]);
        \Phpcmf\Service::V()->display('bfb.html');exit;
    }

    // 内容数量统计
    public function show_count_index() {

        $data = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send');
        !dr_count($data) && $this->_json(0, dr_lang('无可用数据，缓存已失效'));

        $this->_json(count($data['users']), 'ok');
    }

    public function send_add() {

        $page = max(1, intval($_GET['pp']));
        $cache = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send');
        !$cache && $this->_json(0, dr_lang('缓存不存在'));

        $data = $cache['users'][$page];
        $cts = count($cache['users']);
        if ($data) {
            $html = '';
            foreach ($data as $user) {
                $rt = $this->_send_template($user['openid'], $cache['data']['template'], $cache['template'], $cache['data']['url'],  $cache['data']['color']);
                if (!$rt['code']) {
                    $ok = "<span class='error'>".$rt['msg']."</span>";
                    $class = ' p_error';
                } else {
                    $ok = "<span class='ok'>".dr_lang('发送成功')."</span>";
                    \Phpcmf\Service::M()->db->table($this->init['table'])
                        ->where('id', intval($cache['data']['id']))
                        ->increment('counts', 1);
                }
                $html.= '<p class="'.$class.'"><label class="rleft">'.dr_html2emoji($user['nickname']).'</label><label class="rright">'.$ok.'</label></p>';

            }
            $this->_json($page + 1, $html, [
                'msg' => '正在执行第'.$page.'页/共'.$cts.'页',
                'bfb' => round($page/$cts * 100, 2),
            ]);
        }

        // 完成
        \Phpcmf\Service::L('cache')->del_auth_data('app-weixin-template-send');
        $this->_json($cts, 'ok');
    }



    /**
     * 获取微信 access token
     */
    public function _weixin_template_access_token() {

        $cache_data = \Phpcmf\Service::L('cache')->init('file')->get('access_token');
        if (isset($cache_data['time']) && $cache_data['access_token']) {
            $access_token = $cache_data['access_token'];
        } else {
            $weixin = \Phpcmf\Service::C()->get_cache('weixin');
            $result = wx_get_https_json_data('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$weixin['account']['appid'].'&secret='.$weixin['account']['appsecret']);
            if (!$result['code']) {
                return dr_return_data(0, 'AccessToken：'.$result['msg']);
            }
            \Phpcmf\Service::L('cache')->init('file')->save('access_token', $result['data'], 3600);
            $access_token = $result['data']['access_token'];
        }

        return dr_return_data(1, 'ok', ['access_token' => $access_token]);
    }

    private function _send_template($oid, $id, $data, $url = '', $color = '') {

        $rt = $this->_weixin_template_access_token();
        if (!$rt['code']) {
            return dr_return_data(0, $rt['msg']);
        }

        $p = [
            'touser' => $oid,
            'template_id' => $id,
            'url' => $url,
            'topcolor' => $color,
            'data' => $data,
        ];
        $rt = wx_post_https_json_data('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$rt['data']['access_token'], $p);

        return $rt;
    }

    // 复制
    public function copy_edit() {

        $id = intval(\Phpcmf\Service::L('input')->get('id'));
        $data = \Phpcmf\Service::M()->db->table(weixin_wxtable('template'))->where('id', $id)->get()->getRowArray();
        if (!$data) {
            $this->_json(0, dr_lang('数据#%s不存在', $id));
        }

        unset($data['id']);
        $data['title'].= '_copy';

        $rt = \Phpcmf\Service::M()->table(weixin_wxtable('template'))->insert($data);
        if (!$rt['code']) {
            $this->_json(0, dr_lang($rt['msg']));
        }

        $this->_json(1, dr_lang('复制成功'));
    }

    /**
     * 获取内容
     * $id      内容id,新增为0
     * */
    protected function _Data($id = 0) {

        $data = parent::_Data($id);
        if (!$data) {
            return [];
        }

        $data['content'] = dr_string2array($data['content']);
        return $data;
    }

    // 格式化保存数据
    protected function _Format_Data($id, $data, $old) {

        $data[1] = \Phpcmf\Service::L('input')->post('data');
        $data[1]['content'] = dr_array2string($data[1]['content']);
        if (!$id) {
            // 当提交新数据时，把当前时间插入进去
            $data[1]['counts'] = 0;
            $data[1]['inputtime'] = SYS_TIME;
        }

        return $data;
    }

}
