<?php
/*
 * 会议后台相关
 * */
class meet_sys_loginClassModel extends Model
{

    /*
     * 第三方会议-登录————会议后台
     * */
    public function loginMeetSysLogin($uname, $pass='Zhks2023_jw') {
        $baseUrl = getconfig('meetsys_basurl');;

        $loginUrl = $baseUrl.'login';

//        if ($uname == '杰唯智能') {
        $body = [
            'username'=>getconfig('meetsys_admin_name'),
            'password'=>getconfig('meetsys_admin_pass'),
            'from'=>'wx'
        ];
        $adminid = getconfig('meetsys_admin_id');
//        } else {
//            $body = [
//                'username'=>$uname,
//                'password'=>substr(md5($pass), 0, 16),
//                'from'=>'wx'
//            ];
//        }

        // 发送请求
        $resp = $this->sendPostRequest($loginUrl, $body);
        $code = $resp['code'] ?? -1;

        // 登录成功
        if ($code != 0) {
            // 登录报错处理
            if ($code == 400) {
                $msg = $resp['msg'];
                // 本地表中获取到用户信息
                $dataOne = $this->getone("username='$uname'", 'count(1) as con');
                $getCon = $dataOne['con'];

                // 找到了说明已经创建了，肯定是密码错了
                if ($getCon > 0) {
                    // 用户名或者密码错误
                    $type = '用户信息-登录时-'.$code;
                    $remark = $msg;
                    m('log')->addlog($type, $remark);
                    // 阻止一下，要不第二次登录就创建用户了
                    return;
                } else {
                    $type = '用户信息-登录时-'.$code;
                    $remark = '我要创建用户了啊';
                    m('log')->addlog($type, $remark);

                    // 没找到就要创建用户了->执行创建用户
                    $this->createUser($uname, md5($pass));
                    // 创建后登录
                    $resp = $this->sendPostRequest($loginUrl, $body);
                    // 如果创建失败，写日志退出
                    if ($resp['code'] ?? -1!= 0) {
                        $type = '登录第三方会议-登录时-创建用户';
                        $remark = "用户{$uname}登录失败，错误信息：{$resp['msg']}";
                        m('log')->addlog($type, $remark);
                        return;
                    }
                }


            } else {
                $type = '登录第三方会议-登录';
                $remark = "用户{$uname}登录失败，错误信息：{$resp['msg']}";
                m('log')->addlog($type, $remark);
                return;
            }
        }

        // 登录成功记录token
        $resp = $resp['data'];

        $data = [
            'uid' => $resp['user']['id'],
            'admin_id' => $resp['user']['admin_id'],
            'username' => $resp['user']['username'],
            'face' => $resp['user']['face'],
            'door_pass' => $resp['user']['door_pass'],
            'token' => $resp['token'],
            'token_expired' => date('Y-m-d H:i:s', $resp['expired']),
            'oa_uid' =>  $adminid,
            'pass' =>  substr(md5($pass), 0, 16),
            'desc' =>  $pass,
        ];

        // 查找是否已有登录信息
        $conInfo = m('meet_sys_login')->getone("`oa_uid`=$adminid", 'count(1) con');
        $con = $conInfo['con'];

        // 如果存在则更新，不存在则插入
        if ($con > 0) {
            $type = '登录第三方会议-登录2';
            $remark = '更新';
            m('meet_sys_login')->update($data, "`oa_uid`=".$adminid);
        } else {
            $type = '登录第三方会议-登录3';
//            $remark = $con.json_encode($data);
            $remark = '插入';
            m('meet_sys_login')->insert($data);
        }

        m('log')->addlog($type, $remark);

    }


    /*
     * 第三方会议-登录————创建用户
     * */
    public function createUser($uname, $md5Pass, $isSelf=True) {

        $baseUrl = getconfig('meetsys_basurl');
        $url = $baseUrl.'user/add';
        $md5Pass = substr($md5Pass, 0, 16); // 第三方限制长度，限制一下长度
        $body = [
            'username'=>$uname, // 用户名
            'password'=>$md5Pass, // 密码
            'face'=>'' // 人脸图url地址
        ];

        // 会议管理员token
        $adminname = getconfig('meetsys_admin_name');
        $token = $this->getMeetSysToken();

        // 打log
        $type = '登录第三方会议-创建用户-获取token';
        m('log')->addlog($type, $adminname);

        // 请求创建用户接口
        $resp = $this->sendPostRequest($url, $body, $token);
        $code = $resp['code'] ?? -1;

        if ($code != 0) {
            $msg = "用户{$uname}创建失败，错误信息：{$resp['msg']}";
            // 打log
            $type = '登录第三方会议-创建用户';
            $remark = $msg;
            m('log')->addlog($type, $remark);
            return ;
        }
        // 不是本人创建（管理员创建）
        if (!$isSelf) {
            $uinfo = m('admin')->getone("user='$uname'", 'id, user');
            $oaUid = $uinfo['id'] ?? null;
        }

        $resp = $resp['data'];

        $data['uid'] = $resp['id']; // 会议系统用户id
        $data['admin_id'] = $resp['admin_id'];
        $data['username'] = $resp['username'];
        $data['face'] = $resp['face'];
        $data['door_pass'] = $resp['door_pass'];
        $data['oa_uid'] = $isSelf ? $this->adminid : $oaUid; // 信呼系统的用户id
        $data['pass'] = $md5Pass;

        // 查找是否已有登录信息
        $conInfo = m('meet_sys_login')->getone("`uid`={$data['uid']}", 'count(1) con');
        $con = $conInfo['con'];

        // 如果存在则更新，不存在则插入
        if ($con > 0) {
            m('meet_sys_login')->update($data, "`uid`={$data['uid']}");
        } else {
            m('meet_sys_login')->insert($data);
        }

    }

    /*
     * 第三方会议-登录————修改密码
     * */
    public function changePassword($newPass, $oldPass, $token=null) {
        $baseUrl = getconfig('meetsys_basurl');
        $url = $baseUrl.'user/change_password';

        $body = [
            'password'=>$oldPass, // 旧密码
            'new_password'=>$newPass, // 新密码
            'new_password_confirm'=>$newPass // 重复新密码
        ];

        if($token == null) {
            $token = $this->getMeetSysToken($this->adminid);
        }

        $resp = $this->sendPostRequest($url, $body, $token);
        $code = $resp['code'] ?? -1;

        if ($code != 0) {
            $msg = "用户{$this->adminname}修改密码失败，错误信息：{$resp['msg']}";

            // 打log
            $type = '登录第三方会议-修改密码';
            $remark = $msg;
            m('log')->addlog($type, $remark);
        }
    }

    /*
     * 第三方会议-登录————获取用户列表
     * */
    public function syncUserList() {

        // 需要先设置唯一索引 ALTER TABLE xinhu_meet_sys_login ADD UNIQUE INDEX idx_unique_user_id (uid);

        // 获取所有用户
        $baseUrl = getconfig('meetsys_basurl');
        $url = $baseUrl.'user/lst';
        $body = [
            'page'=>0, // 旧密码
            "size"=> 3000
        ];

        $token = m('meet_sys_login')->getMeetSysToken();
        // 从接口获取用户
        $rows = json_decode(m('meet_sys_login')->sendPostRequest($url, $body, $token), true);
        // 组装数组
        $valArr = [];
        $resp = $rows['data']['data'];
        for ($i = 0; $i < count($resp); $i++) {
            $data = $resp[$i];

            $valArr[$i]['uid'] = $data['id'];
            $valArr[$i]['face'] = $data['face'];
            $valArr[$i]['admin_id'] = $data['admin_id'];
            $valArr[$i]['username'] = $data['username'];
            $valArr[$i]['door_pass'] = $data['door_pass'];
        }

        $checkColArr = ['uid'];
        // 更新数据库中用户数据
        $data = m('meet_sys_login')->insertOrUpdate($valArr, $checkColArr);

        $type = '3-用户同步-api';
        $remark = "同步完成";
        m('log')->addlog($type, $remark);

        return $data;
    }


    /*
     * 第三方会议-登录————删除用户
     * */
    public function dropUser($username) {
        $baseUrl = getconfig('meetsys_basurl');
        $url = $baseUrl.'user/del';
        $masterToken = $this->getMeetSysToken();
        $uinfo = $this->getone("username='$username'");
        if (!isset($uinfo['uid'])){
            m('log')->addlog('3-删除用户', "meet_sys_login表内无该用户：$username");
            return $uinfo;
        }
        $uid = intval($uinfo['uid']);
        $body =['id' => $uid];
        $rows = $this->sendPostRequest($url, $body, $masterToken);
        if ($rows['code'] == 0) {
            $this->delete("username='$username'");
            m('log')->addlog('3-删除用户', json_encode($rows));
        } else {
            m('log')->addlog('3-删除用户', "失败：$username");
        }
        return $rows;
    }

    /*
     * 第三方会议-登录————编辑用户信息处理
     * */
    public function changeUserInfo($uname, $md5Pass) {
        // 判断密码是否一致，一致则不动，不一致则修改
        $row = $this->getone("`username`='$uname'", 'username, pass, token');
        $md5Pass = substr($md5Pass, 0, 16); // 第三方限制长度，限制一下长度
        if (isset($row['pass'])) {
            $oldPass = substr($row['pass'], 0, 16); // 第三方限制长度，限制一下长度
            if ($md5Pass != $oldPass) {
                $token = $row['token'];
                $this->changePassword($md5Pass, $oldPass, $token);
                m('log')->addlog('修改密码', json_encode($oldPass));
            } else {
                m('log')->addlog('不修改密码', json_encode($oldPass));
            }
        } else {
            m('log')->addlog('编辑用户信息处理-创建', json_encode($uname));
            $this->createUser($uname, $md5Pass, False);
        }
    }

    /*
     * 第三方会议-登录————获取token
     * */
    public function getMeetSysToken($adminid=null) {
        // 没传默认用管理员id
//        $adminid = $adminid ?? getconfig('meetsys_admin_id');
        $adminid = getconfig('meetsys_admin_id');
        $token = m('meet_sys_login')->getone("oa_uid='{$adminid}'", 'token');
        if ($token == null || $token == '') {
            // 打log
            $type = '登录第三方会议-获取token';
            $remark = '未找到token,需要重新登录';
            m('log')->addlog($type, $remark);
            return -2;
        }
        // 打log
        $type = '登录第三方会议-获取token';
//        $remark = $token['token'];
        $remark = 'token';
        m('log')->addlog($type, $remark);

        return $token['token'];
    }
}