<?php
//  ---------------------------------------------------------------------------------
//    _____   _             _                   _   _____
//   |  __ \ | |           | |    /\           (_) |  __ \
//   | |__) || |__    __ _ | |   /  \    _ __   _  | |__) |_ __  ___
//   |  ___/ | '_ \  / _` || |  / /\ \  | '_ \ | | |  ___/| '__|/ _ \
//   | |     | | | || (_| || | / ____ \ | |_) || | | |    | |  | (_) |
//   |_|     |_| |_| \__,_||_|/_/    \_\| .__/ |_| |_|    |_|   \___/
//                                      | |
//                                      |_|
//   PhalApi Pro 专业版
//   广州果创网络科技有限公司
//
//  ---------------------------------------------------------------------------------
//
//   一、协议的许可和权利
//    1. 您可以在完全遵守本协议的基础上，将本软件应用于商业用途；
//    2. 您可以在协议规定的约束和限制范围内修改本产品源代码或界面风格以适应您的要求；
//    3. 您拥有使用本产品中的全部内容资料、商品信息及其他信息的所有权，并独立承担与其内容相关的
//       法律义务；
//    4. 获得商业授权之后，您可以将本软件应用于商业用途，自授权时刻起，在技术支持期限内拥有通过
//       指定的方式获得指定范围内的技术支持服务；
//
//   二、协议的约束和限制
//    1. 未获商业授权之前，禁止将本软件用于商业用途（包括但不限于企业法人经营的产品、经营性产品
//       以及以盈利为目的或实现盈利产品）；
//    2. 未获商业授权之前，禁止在本产品的整体或在任何部分基础上发展任何派生版本、修改版本或第三
//       方版本用于重新开发；
//    3. 如果您未能遵守本协议的条款，您的授权将被终止，所被许可的权利将被收回并承担相应法律责任；
//
//   三、有限担保和免责声明
//    1. 本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的；
//    2. 会员出于自愿而使用本软件，您必须了解使用本软件的风险，在尚未获得商业授权之前，我们不承
//       诺提供任何形式的技术支持、使用担保，也不承担任何因使用本软件而产生问题的相关责任；
//    3. 广州果创网络科技有限公司不对使用本产品构建的商城中的内容信息承担责任，但在不侵犯会员隐
//       私信息的前提下，保留以任何方式获取会员信息及商品信息的权利；
//
//   有关本产品最终会员授权协议、商业授权与技术服务的详细内容，均由广州果创网络科技有限公司独家
//   提供。广州果创网络科技有限公司拥有在不事先通知的情况下，修改授权协议的权力，修改后的协议对
//   改变之日起的新授权会员生效。电子文本形式的授权协议如同双方书面签署的协议一样，具有完全的和
//   等同的法律效力。您一旦开始修改、安装或使用本产品，即被视为完全理解并接受本协议的各项条款，
//   在享有上述条款授予的权力的同时，受到相关的约束和限制。协议许可范围以外的行为，将直接违反本
//   授权协议并构成侵权，我们有权随时终止授权，责令停止损害，并保留追究相关责任的权力。
//
//  ---------------------------------------------------------------------------------

namespace Admin\Api;

use Admin\Common\Api;
use Base\Domain\Login;
use Base\Domain\User as UserDomain;
use Base\Domain\UserType as UserTypeDomain;
use PhalApi\Exception\BadRequestException;

/**
 * 账号管理模块
 */
class User extends Api {

    public function getRules() {
        $memberTypeDesc = UserTypeDomain::getApiRuleRangeDesc(UserTypeDomain::MEMBER_LEVEL_USER, UserTypeDomain::MEMBER_LEVEL_SUPER_ADMIN + 1, false);
        
        return array(
            'getAllMembers' => array(
                'userId' => array('name' => 'user_id', 'type' => 'int'),
                'username' => array('name' => 'username', 'min' => 1, 'max' => 50, 'desc' => '账号'),
                'memberType' => array('name' => 'member_type', 'type' => 'int', 'desc' => '账号类型，不传表示全部。' . $memberTypeDesc),
                'page' => array('name' => 'page', 'type' => 'int', 'min' => 1, 'default' => 1, 'desc' => '第几页'),
                'perpage' => array('name' => 'perpage', 'type' => 'int', 'min' => 1, 'max' => 5000, 'default' => 10, 'desc' => '分页数量'),
            ),
            'delMember' => array(
                'id' => array('name' => 'id', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '要删除的会员'),
            ),
            'getMember' => array(
                'id' => array('name' => 'id', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '会员uid'),
            ),
            'editMember' => array(
                'id' => array('name' => 'id', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '待修改的会员uid'),
                'password' => array('name' => 'password', 'min' => 6, 'max' => 20, 'desc' => '密码，不传时不修改'),
                'avatar' => array('name' => 'avatar', 'max' => 500, 'desc' => '头像链接，不传时不更新'),
                'nickname' => array('name' => 'nickname', 'max' => 100, 'desc' => '昵称，不传时不更新'),
                'email' => array('name' => 'email', 'max' => 100, 'desc' => '邮箱，不传时不更新'),
                'sex' => array('name' => 'sex', 'desc' => '性别，0未知1男2女，不传时不更新'),
                'mobile' => array('name' => 'mobile', 'max' => 20, 'desc' => '手机号，不传时不更新'),
                'memberType' => array('name' => 'member_type', 'type' => 'int',  'desc' => '账号类型，不传时不更新。' . $memberTypeDesc),
            ),
            'addMember' => array(
                'username' => array('name' => 'username', 'require' => true, 'min' => 1, 'max' => 50, 'desc' => '账号'),
                'password' => array('name' => 'password', 'require' => true, 'min' => 6, 'max' => 20, 'desc' => '密码'),
                'avatar' => array('name' => 'avatar', 'default' => '', 'max' => 500, 'desc' => '头像链接'),
                'nickname' => array('name' => 'nickname', 'default' => '', 'max' => 100, 'desc' => '昵称'),
                'email' => array('name' => 'email', 'default' => '', 'max' => 100, 'desc' => '邮箱'),
                'sex' => array('name' => 'sex', 'default' => '0', 'desc' => '性别，0未知1男2女'),
                'mobile' => array('name' => 'mobile', 'default' => '', 'max' => 20, 'desc' => '手机号'),
                'memberType' => array('name' => 'member_type', 'require' => true, 'type' => 'int', 'default' => 0, 'desc' => '账号类型。' . $memberTypeDesc),
            ),
            'alterMemberStatus' => array(
                'id' => array('name' => 'id', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '账号ID'),
                'type' => array('name' => 'type', 'type' => 'boolean', 'default' => true, 'require' => true, 'desc' => '1解封账号，0禁用账号'),
            ),
            'getDataFlow' => array(
                'startTime' => array('name' => 'start_time', 'desc' => '开始时间'),
                'endTime' => array('name' => 'end_time', 'desc' => '结束时间'),
            ),
            'getLoginStatistics' => array(
                'startTime' => array('name' => 'start_time', 'desc' => '开始时间'),
                'endTime' => array('name' => 'end_time', 'desc' => '结束时间'),
            ),
            'getLastestLoginRecord' => array(
                'topNum' => array('name' => 'top_num', 'type' => 'int', 'min' => 1,  'max' => 100, 'default' => 10, 'desc' => '返回最近多少条登录纪录'),
            ),
            'simulationLogin' => array(
                'uid' => array('name' => 'uid', 'type' => 'int', 'require' => true,  'desc' => '企业uid'),
            ),
        );
    }

    /**
     * 获取所有的会员
     * @desc 获取所有的会员
     * @return array    list
     * @return int      list[].id           id
     * @return string   list[].username     昵称
     * @return string   list[].mobile       手机
     * @return string   list[].email        邮箱
     * @return string   list[].admin_level      会员等级(0表示普通会员,1表示管理员，2超级管理员)
     * @return string   list[].register_time    注册时间
     * @return string   list[].member_status    状态(0表示禁止,1表示正常)
     * @return int total 会员总数
     */
    public function getAllMembers(){
        $domain = new UserDomain();
        return $domain->getAllUser($this->userId, $this->username, $this->memberType, $this->page, $this->perpage);
    }

    /**
     * 删除会员
     * @desc 硬删除会员，超级管理员会员无法删除，删除会员请慎重
     * @return bool is_success 是否删除成功，true表示删除成功，false删除失败
     * @throws BadRequestException
     */
    public function delMember(){
        $rs = array('is_success' => false);
        $domain = new UserDomain();
        if($domain->isSuperAdmin($this->id)){
            throw new BadRequestException(\PhalApi\T("super administrator account cannot be deleted"));
        }
        if($domain->deleteUser($this->id)){
            $rs['is_success'] = true;
        }
        return $rs;
    }
    
    /**
     * 获取会员信息
     * @desc 获取会员的信息，可以获取更全面的会员信息，并用不受会员状态限制影响
     * @return object member 会员信息，没有时为null
     * @return int member.id 会员ID
     * @return string member.username 账号
     * @return string member.register_time 注册时间，例如：2019-12-19 17:03:45
     * @return string member.avatar 头像链接
     * @return string member.nickname 昵称
     * @return string member.email 邮箱
     * @return string member.sex 性别，0未知1男2女
     * @return string member.mobile 手机号
     * @return int member.member_level 会员等级(0表示普通会员,1表示管理员, 2超级管理员)
     * @return int member.member_status 会员状态(0表示禁止,1表示正常)
     * @return string member.ip 会员注册IP地址
     */
    public function getMember() {
        $rs = array('member' => null);
        $domain = new UserDomain();
        $member = $domain->profileByUidForAdmin($this->id);
        if (!empty($member)) {
            $rs['member'] = $member;
        }
        
        return $rs;
    }

    /**
     * 修改会员信息和密码
     * @desc 修改会员信息，以及密码。修改密码的权限：管理员可修改普通会员密码；超级管理员可修改管理员和普通会员密码。
     * @return boolean is_update 是否有更新会员信息，成功有更新时为true
     * @return boolean is_alter_password 是否有更新会员密码，仅当会员密码有提供、修改成功并且有变化时才为true
     */
    public function editMember() {
        $rs = array('is_update' => false, 'is_alter_password' => false);
        
        $domain = new UserDomain();
        $userProfile = $domain->profileByUid($this->id);
        if (empty($userProfile)) {
            throw new BadRequestException(\PhalApi\T("member does not exist or has been deleted"));
        }
        
        // 修改密码
        if (!empty($this->password)) {
            $adminUid = $this->tryToGetUid();
            $isSuperAdmin = $domain->isSuperAdmin($adminUid);
            if (UserTypeDomain::isSuperAdminLevel($userProfile['member_level'])) {
                throw new BadRequestException(\PhalApi\T("super administrator password cannot be modified"));
            }
            if (UserTypeDomain::isAdminLevel($userProfile['member_level']) && !$isSuperAdmin) {
                throw new BadRequestException(\PhalApi\T("insufficient permission, unable to change administrator password"));
            }
            $alterPassRows = $domain->alterPassByUidDirectly($this->id, $this->password);
            if ($alterPassRows > 0) {
                $rs['is_alter_password'] = true;
            }
        }
        
        // 修改会员信息
        $updateRows = $domain->updateProfileByUid($this->id, $this->avatar, $this->nickname, $this->email, $this->sex, $this->mobile, $this->memberType);
        if ($updateRows > 0) {
            $rs['is_update'] = true;
        }
        
        return $rs;
    }
    
    /**
     * 添加账号
     * @desc 添加账号，可以添加账号。只有超级管理员才可以添加超级管理员账号。
     * @return bool is_add 是否注册成功，true注册成功，false注册失败，账号已存在
     * @return int  uid 注册成功后的会员ID，失败时为0
     */
    public function addMember(){
        $rs = array('is_add' => false, 'uid' => 0);

        $domain = new UserDomain();
        
        $adminUid = $this->tryToGetUid();
        $isSuperAdmin = $domain->isSuperAdmin($adminUid);
        if (!$isSuperAdmin && UserTypeDomain::isSuperAdminLevel($userProfile['member_level'])) {
            throw new BadRequestException(\PhalApi\T("super administrator password cannot be modified"));
        }
        
        $profile = $domain->profile($this->username);
        if ($profile) {
            throw new BadRequestException(\PhalApi\T("the account already exists, and repeated registration is not allowed"));
        }
        
        $memberType = $this->memberType;
        $uid = $domain->register($this->username, $this->password, $this->avatar, $this->nickname, $this->email, $this->sex, $this->mobile, $memberType);
        
        $rs['is_add'] = true;
        $rs['uid'] = $uid;
        return $rs;
    }


    /**
     * 获取新客注册统计
     * @desc 获取一个月内每天新客注册统计,同比上个月
     * @return array list
     * @return int  list[].time      时间
     * @return int  list[].total     注册人数
     * @return int  list[].monthAgo  上个月注册人数
     */
    public function getDataFlow() {
        $rs = array('list' => array());
        $domain = new UserDomain();
        $data = $domain->getNewMemberFlow($this->startTime, $this->endTime);
        $rs['list'] = array_values($data);
        return $rs;
    }

    /**
     * 登陆统计
     * @desc 获取登陆统计
     * @return array list
     * @return int list[].time      时间
     * @return int list[].total     总登陆人数
     * @return int list[].success   登陆成功人数
     * @return int list[].fail      登陆失败人数
     */
    public function getLoginStatistics() {
        $rs = array('list' => array());
        $domain = new Login();
        $data = $domain->getLoginStatistics($this->startTime, $this->endTime);
        $rs['list'] =  array_values($data);
        return $rs;
    }
    
    /**
     * 修改会员状态
     * @desc 解封和锁定会员，type为1解封会员，0锁定会员
     * @return bool is_success 是否修改成功，true表示修改成功，false修改失败
     */
    public function alterMemberStatus() {
        $rs = array('is_success' => false);
        $status = $this->type ? 1 : 0;
        $domain = new UserDomain();
        if ($domain->alterMemberStatus($this->id, $status)) {
            $rs['is_success'] = true;
        }
        return $rs;
    }
    
    /**
     * 获取最近登录纪录
     * @desc 获取当前会员最近成功登录的纪录
     * @return array records 成功登录的纪录，没有时为空数组
     * @return int records[].id 纪录ID
     * @return string records[].login_ip 登录IP
     * @return string records[].login_time 登录时间
     */
    public function getLastestLoginRecord() {
        $rs = array('records' => array());
        
        $domain = new UserDomain();
        $uid = $this->tryToGetUid();
        $userProfile = $domain->profileByUid($uid);
        
        $domainLogin = new Login();
        $rs['records'] = $domainLogin->getLastestLoginRecord($userProfile['username'], $this->topNum);
        
        return $rs;
    }

    /**
     * 获取全部账号类型
     * @desc 获取全部账号类型，包括会员、开发者和管理员。只有当前为超级管理员时，才额外返回超级管理员。
     */
    public function getAllMemberLevelList() {
        $domain = new UserDomain();
        $adminUid = $this->tryToGetUid();
        $isSuperAdmin = $domain->isSuperAdmin($adminUid);
        
        $rs = array('list' => UserTypeDomain::getAllMemberLevelList($isSuperAdmin));
        return $rs;
    }

    /**
     * 模拟登录
     * @desc 模拟登录
     */
    public function simulationLogin(){
        $domain = new UserDomain();
        return $domain->simulationLogin($this->uid);
    }
}
