<?php namespace Phpcmf\Model\Mform;

// 模型类
class Mform extends \Phpcmf\Model
{

    // 创建
    public function create_module_form($data) {

        $data['name'] = dr_safe_filename($data['name']);

        // 为全部站点模块创建表单
        foreach (\Phpcmf\Service::C()->site_info as $sid => $v) {
            $par = $this->dbprefix(dr_module_table_prefix($data['module'], $sid)); // 父级表
            $pre = $par.'_form_'.$data['table']; // 当前表
            // 判断模块是否安装过
            if (!$this->is_table_exists($par)) {
                continue;
            }
            \Phpcmf\Service::M('table')->create_table(
                $pre,
                [
                    'id' => 'int(10) unsigned NOT NULL AUTO_INCREMENT',
                    'cid' => 'int(10) unsigned NOT NULL COMMENT \'内容id\'',
                    'catid' => 'mediumint(8) unsigned NOT NULL COMMENT \'栏目id\'',
                    'uid' => 'mediumint(8) unsigned NOT NULL COMMENT \'作者id\'',
                    'author' => 'varchar(50) NOT NULL COMMENT \'作者名称\'',
                    'inputip' => 'varchar(200) DEFAULT NULL COMMENT \'录入者ip\'',
                    'inputtime' => 'int(10) unsigned NOT NULL COMMENT \'录入时间\'',
                    'title' => 'varchar(255) DEFAULT NULL COMMENT \'表单主题\'',
                    'status' => 'tinyint(1) DEFAULT NULL COMMENT \'状态值\'',
                    'tableid' => 'smallint(5) unsigned NOT NULL COMMENT \'附表id\'',
                    'displayorder' => 'int(10) DEFAULT NULL COMMENT \'排序值\'',
                ],
                [
                    'PRIMARY KEY (`id`)',
                    'KEY `cid` (`cid`)',
                    'KEY `uid` (`uid`)',
                    'KEY `catid` (`catid`)',
                    'KEY `author` (`author`)',
                    'KEY `status` (`status`)',
                    'KEY `displayorder` (`displayorder`)',
                    'KEY `inputtime` (`inputtime`)',
                ],
                '模块表单'.$data['name'].'表'
            );
            \Phpcmf\Service::M('table')->create_table(
                $pre.'_data_0',
                [
                    'id' => 'int(10) unsigned NOT NULL',
                    'cid' => 'int(10) unsigned NOT NULL COMMENT \'内容id\'',
                    'catid' => 'mediumint(8) unsigned NOT NULL COMMENT \'栏目id\'',
                    'uid' => 'mediumint(8) unsigned NOT NULL COMMENT \'作者id\'',
                ],
                [
                    'UNIQUE KEY `id` (`id`)',
                    'KEY `cid` (`cid`)',
                    'KEY `catid` (`catid`)',
                    'KEY `uid` (`uid`)',
                ],
                '模块表单'.$data['name'].'附表'
            );
            // 加上统计字段
            if ($this->is_field_exists($par, $data['table']."_total")) {
                continue;
            }
            \Phpcmf\Service::M('table')->add_field(
                $par,
                $data['table'].'_total',
                'INT(10) UNSIGNED',
                'NULL DEFAULT \'0\'',
                '表单'.$data['name'].'统计'
            );
        }

        // 删除原有的冗余字段
        $this->db->table('field')->where('relatedid', $data['id'])->where('relatedname', 'mform-'.$data['module'])->delete();

        // 默认字段
        $this->db->table('field')->insert(array(
            'name' => '主题',
            'fieldname' => 'title',
            'fieldtype' => 'Text',
            'relatedid' => $data['id'],
            'relatedname' => 'mform-'.$data['module'],
            'isedit' => 1,
            'ismain' => 1,
            'ismember' => 1,
            'issystem' => 1,
            'issearch' => 1,
            'disabled' => 0,
            'setting' => dr_array2string(array(
                'option' => array(
                    'width' => 300, // 表单宽度
                    'fieldtype' => 'VARCHAR', // 字段类型
                    'fieldlength' => '255' // 字段长度
                ),
                'validate' => array(
                    'xss' => 1, // xss过滤
                    'required' => 1, // 表示必填
                )
            )),
            'displayorder' => 0,
        ));
        $this->db->table('field')->insert(array(
            'name' => '作者',
            'fieldname' => 'author',
            'fieldtype' => 'Text',
            'relatedid' => $data['id'],
            'relatedname' => 'mform-'.$data['module'],
            'isedit' => 1,
            'ismain' => 1,
            'ismember' => 1,
            'issystem' => 1,
            'issearch' => 1,
            'disabled' => 0,
            'setting' => dr_array2string(array(
                'is_right' => 1,
                'option' => array(
                    'width' => 200, // 表单宽度
                    'fieldtype' => 'VARCHAR', // 字段类型
                    'fieldlength' => '255' // 字段长度
                ),
                'validate' => array(
                    'xss' => 1, // xss过滤
                )
            )),
            'displayorder' => 0,
        ));
    }

    // 删除模块表单
    public function delete_module_form($data) {

        $id = intval($data['id']);
        $table = $this->dbprefix(dr_module_table_prefix($data['module']).'_form_'.$data['table']);
        // 判断模块是否存在表
        if (!$this->is_table_exists($table)) {
            return;
        }

        // 删除字段
        $this->db->table('field')->where('relatedid', $id)->where('relatedname', 'mform-'.$data['module'])->delete();

        // 删除表
        \Phpcmf\Service::M('table')->drop_table($table, true);

        // 删除附表
        for ($i = 0; $i < 200; $i ++) {
            if (!$this->is_table_exists($table.'_data_'.$i)) {
                break;
            }
            \Phpcmf\Service::M('table')->drop_table($table.'_data_'.$i, true);
        }

        // 模块表统计字段删除
        $par = $this->dbprefix(dr_module_table_prefix($data['module']));
        // 判断模块是否存在表
        if (!$this->is_table_exists($par)) {
            return;
        }

        if ($this->is_field_exists($par, $data['table']."_total")) {
            \Phpcmf\Service::M('table')->drop_field($par, $data['table'].'_total');
        }

        // 挂钩点
        \Phpcmf\Hooks::trigger('module_form_uninstall_after', $data);
    }

    // 创建表单文件
    public function create_form_file($dir, $table, $call = 0) {

        $dir = ucfirst($dir);
        $path = dr_get_app_dir($dir);
        if (!is_dir($path)) {
            return dr_return_data(1, 'ok');
        }

        $name = ucfirst($table);
        $temp = dr_get_app_dir('mform').'Code/';
        $files = [
            $path.'Controllers/'.$name.'.php' => $temp.'$NAME$.php',
            $path.'Controllers/Member/'.$name.'.php' => $temp.'Member$NAME$.php',
            $path.'Controllers/Admin/'.$name.'.php' => $temp.'Admin$NAME$.php',
            $path.'Controllers/Admin/'.$name.'_verify.php' => $temp.'Admin$NAME$_verify.php',
        ];

        $ok = 0;
        foreach ($files as $file => $form) {
            if (!is_file($file)) {
                $c = file_get_contents($form);
                $size = file_put_contents($file, str_replace('$NAME$', $name, $c));
                if (!$size && $call) {
                    unlink($file);
                    return dr_return_data(0, dr_lang('文件%s创建失败，无可写权限', str_replace(FCPATH, '', $file)));
                }
                $ok ++;
            }
        }

        return dr_return_data(1, $ok);
    }


    // 创建模块表单
    public function create_form($dir, $data) {

        // 插入表单数据
        $data['table'] = strtolower($data['table']);
        $rt = $this->table('module_form')->insert([
            'name' => $data['name'],
            'table' => $data['table'],
            'module' => $dir,
            'setting' => '',
            'disabled' => 0,
        ]);

        if (!$rt['code']) {
            return $rt;
        }

        $id = $data['id'] = $rt['code'];
        $data['module'] = $dir;

        // 创建文件
        $rt = $this->create_form_file($dir, $data['table']);
        if (!$rt['code']) {
            $this->table('module_form')->delete($id);
            return $rt;
        }

        // 创建表
        $this->create_module_form($data);

        return dr_return_data(1, 'ok');
    }

    // 删除模块表单
    public function delete_form($ids) {

        foreach ($ids as $id) {
            $row = $this->table('module_form')->get(intval($id));
            if (!$row) {
                return dr_return_data(0, dr_lang('模块表单不存在(id:%s)', $id));
            }
            $rt = $this->table('module_form')->delete($id);
            if (!$rt['code']) {
                return dr_return_data(0, $rt['msg']);
            }
            $name = ucfirst($row['table']);
            $path = dr_get_app_dir($row['module']);
            unlink($path.'Controllers/'.$name.'.php');
            unlink($path.'Controllers/Admin/'.$name.'.php');
            unlink($path.'Controllers/Member/'.$name.'.php');
            unlink($path.'Controllers/Admin/'.$name.'_verify.php');
            // 删除表数据
            $this->delete_module_form($row);
        }

        return dr_return_data(1, '');
    }

    public function link_menu($form, $table, $mdir, $config, $left) {
        // 表单入库
        if ($form) {
            foreach ($form as $t) {
                $mark = 'app-mform-verify-'.$mdir.'-'.$t['table'];
                $menu = $this->db->table($table.'_menu')->where('mark', $mark)->get()->getRowArray();
                $save = [
                    'uri' => $mdir.'/'.$t['table'].'_verify/index',
                    'mark' => $mark,
                    'name' => $menu && $menu['name'] ? $menu['name'] : dr_lang('%s%s', $config['name'], $t['name']),
                    'icon' => $menu && $menu['icon'] ? $menu['icon'] : dr_icon($t['setting']['icon']),
                    'displayorder' => $menu ? intval($menu['displayorder']) : '-1',
                ];
                $menu ? \Phpcmf\Service::M('menu')->_edit($table, $menu['id'], $save) : \Phpcmf\Service::M('menu')->_add($table, $left['id'], $save);
            }
        }
    }

    public function link_delete($module, $dir) {

        $this->db->table('field')->where('relatedid', $module['id'])->where('relatedname', 'mform-'.$dir)->delete();
        $this->db->table('admin_menu')->like('mark', 'app-mform-verify-'.$dir)->delete();
        $this->db->table('module_form')->where('module', $dir)->delete();
    }

    public function link_uninstall($table, $dir) {

        // 删除表单
        $form = $this->db->table('module_form')->where('module', $dir)->get()->getResultArray();
        if ($form) {
            foreach ($form as $t) {
                $mytable = $table.'_form_'.$t['table'];
                // 主表
                \Phpcmf\Service::M('table')->drop_table($mytable, true);
                // 附表
                for ($i = 0; $i < 200; $i ++) {
                    if (!$this->is_table_exists($mytable.'_data_'.$i)) {
                        break;
                    }
                    \Phpcmf\Service::M('table')->drop_table($mytable.'_data_'.$i, true);
                }
            }
        }
    }

    private function _link_install($module, $mpath, $dir, $table) {
        if (is_file($mpath.'Config/Form.php')) {
            $form = require $mpath.'Config/Form.php';
            if ($form) {
                foreach ($form as $ftable => $t) {
                    // 插入表单数据
                    $rt = $this->table('module_form')->insert([
                        'name' => $t['form']['name'],
                        'table' => $ftable,
                        'module' => $dir,
                        'setting' => $t['form']['setting'],
                        'disabled' => 0,
                    ]);
                    if ($rt['code']) {
                        // 建表（Schema → create_table；旧版 CREATE SQL → formatCreateSql）
                        foreach ([1 => $table.'_form_'.$ftable, 0 => $table.'_form_'.$ftable.'_data_0'] as $ti => $tablename) {
                            $def = $t['table'][$ti] ?? '';
                            if (is_array($def) && isset($def['fields'])) {
                                \Phpcmf\Service::M('table')->create_table(
                                    $tablename,
                                    $def['fields'],
                                    $def['indexes'] ?? [],
                                    $def['comment'] ?? ''
                                );
                            } elseif ($def) {
                                $this->db->simpleQuery(str_replace('{tablename}', $tablename, dr_format_create_sql((string) $def)));
                            }
                        }
                        // 插入自定义字段
                        foreach ([1, 0] as $is_main) {
                            $f = $t['field'][$is_main];
                            if ($f) {
                                foreach ($f as $field) {
                                    \Phpcmf\Service::M('module')->_add_field($field, $is_main, $rt['code'], 'mform-'.$dir);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    public function link_install($module, $mpath, $dir, $table) {
        // 创建表单
        if (dr_count($module['site']) == 1) {
            // 表示第一个站就创建表单
            $this->_link_install($module, $mpath, $dir, $table);
        } else {
            // 创建模块已经存在的表单
            $form = $this->db->table('module_form')->where('module', $dir)->get()->getResultArray();
            if ($form) {
                $this->db->resetDataCache();// 清除缓存，影响字段存在的重复
                foreach ($form as $t) {
                    // 表示存在多个站
                    $sid = 0;
                    foreach ($module['site'] as $site => $tt) {
                        if ($this->is_table_exists($this->dbprefix($site.'_'.$dir).'_form_'.$t['table'])) {
                            // 表示已经在其他站创建过了,我们就复制它以前创建的表结构
                            $sid = $site;
                            break;
                        }
                    }
                    if ($sid) {
                        // 开始创建表单
                        $mytable = $table.'_form_'.$t['table'];
                        $cptable = $this->dbprefix($sid.'_'.$dir).'_form_'.$t['table'];
                        // 主表
                        list($sql) = \Phpcmf\Service::M('table')->create_table_sql($cptable);
                        $sql = str_replace($cptable, $mytable, $sql);
                        $this->db->simpleQuery(dr_format_create_sql($sql));
                        // 附表
                        list($sql) = \Phpcmf\Service::M('table')->create_table_sql($cptable.'_data_0');
                        $sql = str_replace($cptable.'_data_0', $mytable.'_data_0', $sql);
                        $this->db->simpleQuery(dr_format_create_sql($sql));
                    } else {
                        // 没有表就删除表单
                        //log_message('error', '没有表就删除表单');
                        $this->db->table('module_form')->where('id', $t['id'])->delete();
                    }
                }
            } else {
                $this->_link_install($module, $mpath, $dir, $table);
            }
        }
    }

    // 缓存
    public function link_cache($mdir, $cache) {
        $form = $this->table('module_form')->where('module', $mdir)->where('disabled', 0)->order_by('id ASC')->getAll();
        if ($form) {
            foreach ($form as $t) {
                $t['field'] = [];
                // 模块表单的自定义字段
                if (!$this->table('field')
                    ->where('relatedname', 'mform-'.$mdir)
                    ->where('relatedid', intval($t['id']))
                    ->where('fieldname', 'author')->counts()) {
                    $this->db->table('field')->insert(array(
                        'name' => '作者',
                        'fieldname' => 'author',
                        'fieldtype' => 'Text',
                        'relatedid' => $t['id'],
                        'relatedname' => 'mform-'.$mdir,
                        'isedit' => 1,
                        'ismain' => 1,
                        'ismember' => 1,
                        'issystem' => 1,
                        'issearch' => 1,
                        'disabled' => 0,
                        'setting' => dr_array2string(array(
                            'is_right' => 1,
                            'option' => array(
                                'width' => 200, // 表单宽度
                                'fieldtype' => 'VARCHAR', // 字段类型
                                'fieldlength' => '255' // 字段长度
                            ),
                            'validate' => array(
                                'xss' => 1, // xss过滤
                            )
                        )),
                        'displayorder' => 0,
                    ));
                }
                $field = $this->db->table('field')->where('disabled', 0)->where('relatedid', intval($t['id']))->where('relatedname', 'mform-'.$mdir)->orderBy('displayorder ASC, id ASC')->get()->getResultArray();
                if ($field) {
                    foreach ($field as $f) {
                        $f['setting'] = dr_string2array($f['setting']);
                        $t['field'][$f['fieldname']] = $f;
                    }
                }
                $t['setting'] = dr_string2array($t['setting']);
                // 排列table字段顺序
                $t['setting']['list_field'] = dr_list_field_order($t['setting']['list_field']);
                $cache['form'][$t['table']] = $t;
            }
        }
        return $cache;
    }

    // 保存数据
    public function save_content($mid, $tid, $index, $data, $data2 = []) {

        $data['status'] = isset($data['status']) ? intval($data['status']) : 1;
        $data['uid'] = isset($data['uid']) ? intval($data['uid']) : (int)$this->member['uid'];
        $data['author'] = isset($data['author']) ? trim($data['author']) : $this->member['username'];
        $data['inputip'] = isset($data['inputip']) ? $data['inputip'] : \Phpcmf\Service::L('input')->ip_info();
        $data['inputtime'] = isset($data['inputtime']) ? $data['inputtime'] : SYS_TIME;
        $data['tableid'] = 0;
        $data['displayorder'] = isset($data['displayorder']) ? $data['displayorder'] : 0;
        $data['cid'] = intval($index['id']); // 内容id
        $data['catid'] = intval($index['catid']); // 栏目id
        // 插入主表
        $table = $mid.'_form_'.$tid;
        $rt = $this->table_site($table)->insert($data);
        if (!$rt['code']) {
            return $rt;
        }
        $etable = dr_mform_ctable($mid, $tid, $data['cid'], 0);
        if ($table != $etable) {
            // 备用表
            $this->table_site($etable)->replace($data);
        }
        $data['id'] = $rt['code'];
        if ($data2) {
            // 如果要使用附表分表就 按一定量进行分表设置 比如50000
            $data['tableid'] = \Phpcmf\Service::M()->get_table_id($rt['code']);
            if ($data['tableid'] > 0) {
                // 判断附表是否存在,不存在则创建
                $this->is_data_table(SITE_ID.'_'.$mid.'_form_'.$tid.'_data_', $data['tableid']);
                // 更新tableid到主表
                $this->table_site($mid.'_form_'.$tid)->update($data['id'], ['tableid' => $data['tableid']]);
                if ($table != $etable) {
                    // 备用表
                    $this->table_site($etable)->update($data['id'], ['tableid' => $data['tableid']]);
                }
            }
            $data2['id'] = $data['id'];
            $data2['uid'] = $data['uid'];
            $data2['cid'] = $data['cid']; // 内容id
            $data2['catid'] = $data['catid']; // 栏目id
            // 插入附表
            $rt2 = $this->table_site($mid.'_form_'.$tid.'_data_'.$data['tableid'])->insert($data2);
            if (!$rt2['code']) {
                // 删除主表
                $this->table_site($mid.'_form_'.$tid)->delete($data['id']);
                if ($table != $etable) {
                    // 备用表
                    $this->table_site($etable)->delete($data['id']);
                }
                return $rt2;
            }
        }
        if ($table != $etable) {
            // 备用表
            $total = $this->table_site($etable)->where('status', 1)->where('cid', $data['cid'])->counts();
        } else {
            $total = $this->table_site($mid.'_form_'.$tid)->where('status', 1)->where('cid', $data['cid'])->counts();
        }

        $this->table_site($mid)->update($data['cid'], [
            $tid.'_total' => $total,
        ]);

        return $rt;
    }


    // 模块表单内容地址
    public function show_url($form, $id, $mid = '', $page = 0) {

        // 模块目录识别
        defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR;
        $mid && $dir = $mid;

        $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir);

        return \Phpcmf\Service::L('router')->url_prefix('php', $module, [], SITE_FID) . 'c=' . $form . '&m=show&id=' . $id . ($page > 1 || strlen($page) > 1 ? '&page=' . $page : '');
    }


    // 模块表单提交地址
    public function post_url($form, $cid, $mid = '') {

        // 模块目录识别
        defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR;
        $mid && $dir = $mid;

        $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir);

        return \Phpcmf\Service::L('router')->url_prefix('php', $module, [], SITE_FID) . 'c=' . $form . '&m=post&cid=' . $cid;
    }


    // 模块表单列表地址
    public function list_url($form, $cid, $mid = '', $page = 0) {

        // 模块目录识别
        defined('MOD_DIR') && MOD_DIR && $dir = MOD_DIR;
        $mid && $dir = $mid;

        $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dir);

        return \Phpcmf\Service::L('router')->url_prefix('php', $module, [], SITE_FID) . 'c=' . $form . '&m=index&cid=' . $cid . ($page > 1 || strlen($page) > 1 ? '&page=' . $page : '');
    }

    /**
     * 删除模块内容时的联动
     */
    public function delete_content($id, $siteid, $dirname) {

        if (!$id) {
            return;
        }

        $module = \Phpcmf\Service::L('cache')->get('module-' . SITE_ID . '-' . $dirname);
        if ($module['form']) {
            foreach ($module['form'] as $m) {
                $table = $this->dbprefix(dr_module_table_prefix($dirname).'_form_'.$m['table']);
                // 判断模块是否存在表
                if ($this->is_table_exists($table)) {
                   $this->db->table($table)->where('cid', $id)->delete();
                   $this->db->table($table.'_data_0')->where('cid', $id)->delete();
                }
            }
        }

    }

    // 更新统计字段
    public function update_form_total($cid, $form) {
        $total = $this->table(dr_mform_ctable(APP_DIR, $form, $cid))
            ->where('status', 1)
            ->where('cid', $cid)
            ->counts();
        $this->table(dr_module_table_prefix(APP_DIR))->update($cid, [
            $form.'_total' => $total,
        ]);
    }
}