<?php

defined('MBQ_IN_IT') or exit;

MbqMain::$oClk->includeClass('MbqBaseRdEtUser');

/**
 * user read class

 */
Class MbqRdEtUser extends MbqBaseRdEtUser {

    public function __construct() {
    }

    public function makeProperty(&$oMbqEtUser, $pName, $mbqOpt = array()) {
        switch ($pName) {
            default:
                MbqError::alert('', __METHOD__ . ',line:' . __LINE__ . '.' . MBQ_ERR_INFO_UNKNOWN_PNAME . ':' . $pName . '.');
                break;
        }
    }

    /**
     * login
     *
     * @param  String  $loginName
     * @param  String  $password
     * @return  Boolean  return true when login success.
     */
    public function login($login, $password, $anonymous, $push) {
        $result = MbqMain::$oMbqAppEnv->oApp->login(array('username' => $login, 'password' => $password), array('remember' => false));
        if ($result) {
            MbqMain::$oMbqAppEnv->oCurJUser = JFactory::getUser();
            KunenaUserHelper::initialize();
            MbqMain::$oMbqAppEnv->oCurKunenaUser = KunenaUserHelper::getMyself();
            $this->initOCurMbqEtUser(MbqMain::$oMbqAppEnv->oCurJUser->id);
        }
        return $result ? true : false;
    }
    /**
     * login
     *
     * @param  String  $loginName
     * @param  String  $password
     * @return  Boolean  return true when login success.
     */
    public function loginDirectly($oMbqEtUser, $trustCode) {
        $app = JFactory::getApplication ();
        $db = JFactory::getDBO ();
        $query = 'SELECT `id`, `username`, `password` FROM `#__users` WHERE id = ' . $db->Quote ($oMbqEtUser->userId->oriValue);
        $db->setQuery ($query);
        $result = $db->loadObject ();

        if ($result AND ! empty ($result->username))
        {
            JPluginHelper::importPlugin ('user');

            //Setup options
            $options = array ();
            $options ['action'] = 'core.login.site';
            $session = JFactory::getSession();
            $response = new stdClass();
            $response->username = $result->username;
            $app->triggerEvent ('onUserLogin', array ((array) $response, $options));
        }
        if ($result) {
            MbqMain::$oMbqAppEnv->oCurJUser = JFactory::getUser();
            KunenaUserHelper::initialize();
            MbqMain::$oMbqAppEnv->oCurKunenaUser = KunenaUserHelper::getMyself();
            $this->initOCurMbqEtUser(MbqMain::$oMbqAppEnv->oCurJUser->id);
        }
        return $result ? true : false;
    }

    /**
     * logout
     *
     * @return  Boolean  return true when logout success.
     */
    public function logout() {
        $result = MbqMain::$oMbqAppEnv->oApp->logout();
        return $result ? true : false;
    }

    /**
     * get user objs
     *
     * @param  Mixed  $var
     * @param  Array  $mbqOpt
     * $mbqOpt['case'] = 'byUserIds' means get data by user ids.$var is the ids.
     * @mbqOpt['case'] = 'online' means get online user.
     * @return  Array
     */
    public function getObjsMbqEtUser($var, $mbqOpt) {
        if ($mbqOpt['case'] == 'byUserIds') {
            require_once(MBQ_APPEXTENTION_PATH.'ExttMbqKunenaUserHelper.php');
            $userIds = $var;
            $objsKunenaUser = ExttMbqKunenaUserHelper::exttMbqLoadUsers($userIds);
            $objsJUser = array();
            $objsMbqEtUser = array();
            foreach ($userIds as $userId) {
                if ($oJUser = JFactory::getUser($userId)) {
                    $objsJUser[$oJUser->id] = $oJUser;
                }
            }
            foreach ($objsKunenaUser as $oKunenaUser) {
                foreach ($objsJUser as $oJUser) {
                    if ($oKunenaUser->userid && ($oKunenaUser->userid == $oJUser->id)) {
                        $objsMbqEtUser[] = $this->initOMbqEtUser(array('oJuser' => $oJUser, 'oKunenaUser' => $oKunenaUser), array('case' => 'JUserAndKunenaUser'));
                    }
                }
            }
            return $objsMbqEtUser;
        } elseif ($mbqOpt['case'] == 'searchByName') {
            $oMbqDataPage = $mbqOpt['oMbqDataPage'];
            $oDb = JFactory::getDBO();
            $query ="SELECT id FROM #__users WHERE name like  ".$oDb->quote('%'.$var.'%');
    		$oDb->setQuery($query);
    		$results = $oDb->loadAssocList();
            $oMbqDataPage->datas = array();
            if ($oDb->getErrorNum()) {
    		    MbqError::alert('', MBQ_ERR_INFO_DB_FAIL, '', MBQ_ERR_APP);
    		} else {
                if($results)
                {
                    foreach($results as $result)
                    {
                        $oMbqDataPage->datas[] = $this->initOMbqEtUser($result['id'], array('case' => 'byUserId'));
                    }
                }
    		}
            $oMbqDataPage->totalNum = sizeof($oMbqDataPage->datas);
            return $oMbqDataPage;

        } elseif ($mbqOpt['case'] == 'online') {
            $oMbqDataPage = $mbqOpt['oMbqDataPage'];
            $arr = KunenaUserHelper::getOnlineUsers();
            $oMbqDataPage->datas = $this->getObjsMbqEtUser(array_keys($arr), array('case' => 'byUserIds'));
            return $oMbqDataPage;
        }
        MbqError::alert('', __METHOD__ . ',line:' . __LINE__ . '.' . MBQ_ERR_INFO_UNKNOWN_CASE);
    }

    /**
     * init one user by condition
     *
     * @param  Mixed  $var
     * @param  Array  $mbqOpt
     * $mbqOpt['case'] = 'JUserAndKunenaUser' means init user by JUser obj and KunenaUser obj.$var['oJuser'] is JUser obj,$var['oKunenaUser'] is KunenaUser obj.
     * $mbqOpt['case'] = 'byUserId' means init user by user id.$var is user id.
     * $mbqOpt['case'] = 'byLoginName' means init user by login name.$var is login name.
     * $mbqOpt['case'] = 'byEmail' means init user by user email.$var is user email.
     * @return  Mixed
     */
    public function initOMbqEtUser($var, $mbqOpt) {
        if ($mbqOpt['case'] == 'JUserAndKunenaUser') {
            $oJUser = $var['oJuser'];
            $oKunenaUser = $var['oKunenaUser'];
            $oMbqEtUser = MbqMain::$oClk->newObj('MbqEtUser');
            $oMbqEtUser->userId->setOriValue($oJUser->id);
            $oMbqEtUser->loginName->setOriValue($oJUser->username);
            $oMbqEtUser->userName->setOriValue($oJUser->name);
            $oMbqEtUser->userEmail->setOriValue($oJUser->email);
            $oMbqEtUser->password->setOriValue($oJUser->password);
            if (property_exists($oJUser, 'groups')) //used in joomla 2.5.x
                $oMbqEtUser->userGroupIds->setOriValue(MbqMain::$oMbqCm->removeArrayKey($oJUser->groups));
            else    //used in joomla 1.5.x
                $oMbqEtUser->userGroupIds->setOriValue(array($oJUser->gid));
            $avatar = $var['oKunenaUser']->getAvatarURL();
            $isdefaultAvatar = strpos($avatar,'nophoto.jpg') !== false;
            if($isdefaultAvatar == false)
            {
                $oMbqEtUser->iconUrl->setOriValue($avatar);
            }
            $oMbqEtUser->canSearch->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canSearch.range.yes'));
            $oMbqEtUser->postCount->setOriValue($var['oKunenaUser']->posts);
            if(!empty(MbqMain::$oMbqAppEnv->pm)){
                $oMbqEtUser->canPm->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canPm.range.yes'));
                $oMbqEtUser->canSendPm->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canSendPm.range.yes'));
            }
            //$oMbqEtUser->displayText->setOriValue($var['oKunenaUser']->signature);
            $oMbqEtUser->displayText->setOriValue($var['oKunenaUser']->getRank(0, 'title'));
            $oMbqEtUser->regTime->setOriValue(strtotime($oJUser->registerDate));
            $oMbqEtUser->lastActivityTime->setOriValue(strtotime($oJUser->lastvisitDate));
            if(TT_GetKunenaVersion() == 4)
            {
                $oMbqEtUser->isOnline->setOriValue($var['oKunenaUser']->isOnline() ? MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.isOnline.range.yes') : MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.isOnline.range.no'));
            }
            $oMbqEtUser->isBan->setOriValue($var['oKunenaUser']->isBanned() ? MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.isBan.range.yes') : MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.isBan.range.no'));
            if(isset(MbqMain::$oMbqAppEnv->oKunenaConfig) && !empty(MbqMain::$oMbqAppEnv->oKunenaConfig))
            {
                $oMbqEtUser->maxAttachment->setOriValue(MbqMain::$oMbqAppEnv->oKunenaConfig->attachment_limit);
                $oMbqEtUser->maxPngSize->setOriValue(MbqMain::$oMbqAppEnv->oKunenaConfig->imagesize * 1024);
                $oMbqEtUser->maxJpgSize->setOriValue(MbqMain::$oMbqAppEnv->oKunenaConfig->imagesize * 1024);
                $oMbqEtUser->allowedExtensions->setOriValue('jpeg,jpg,png,gif');
            }
            $oMbqEtUser->mbqBind['oJuser'] = $var['oJuser'];
            $oMbqEtUser->mbqBind['oKunenaUser'] = $var['oKunenaUser'];
            $oMbqEtUser->canWhosonline->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canWhosonline.range.yes'));
            if($var['oKunenaUser']->moderator == 1 || $var['oKunenaUser']->isAdmin())
            {
                $oMbqEtUser->canModerate->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canModerate.range.yes'));
            }
            $ban = KunenaUserBan::getInstanceByUserid ( $oMbqEtUser->userId->oriValue, true );
            if ($ban->canBan()) {
                $oMbqEtUser->canBan->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canBan.range.yes'));
            } else {
                $oMbqEtUser->canBan->setOriValue(MbqBaseFdt::getFdt('MbqFdtUser.MbqEtUser.canBan.range.no'));
            }
            $oMbqEtUser->userType->setOriValue($this->getUserType($var['oJuser'], $var['oKunenaUser']));
            return $oMbqEtUser;
        } elseif ($mbqOpt['case'] == 'byUserId') {
            $userId = $var;
            $oJUser = JFactory::getUser($userId);
            $oKunenaUser = new KunenaUser($userId);
            return $this->initOMbqEtUser(array('oJuser' => $oJUser, 'oKunenaUser' => $oKunenaUser), array('case' => 'JUserAndKunenaUser'));
        } elseif ($mbqOpt['case'] == 'byLoginName') {
            $loginName = $var;
            $oKunenaUser = KunenaFactory::getUser($loginName);
            if ($oKunenaUser->userid) {
                return $this->initOMbqEtUser($oKunenaUser->userid, array('case' => 'byUserId'));
            } else {
                return null;
            }
        } elseif ($mbqOpt['case'] == 'byEmail') {
            $oDb = JFactory::getDBO();
            $query ="SELECT id FROM #__users WHERE email = ".$oDb->quote($var);
    		$oDb->setQuery($query);
    		$result = $oDb->loadAssocList();
    		if ($oDb->getErrorNum()) {
    		    MbqError::alert('', MBQ_ERR_INFO_DB_FAIL, '', MBQ_ERR_APP);
    		} else {
    		    if ($result) {
    		        if (count($result) == 1) {
    		            return $this->initOMbqEtUser($result[0]['id'], array('case' => 'byUserId'));
    		        } else {    //too many users have same email.
    		            MbqError::alert('', 'Sorry.Looks there are too many users have same email.', '', MBQ_ERR_APP);
    		        }
    		    } else {
    		        return null;
    		    }
    		}
        }
        MbqError::alert('', __METHOD__ . ',line:' . __LINE__ . '.' . MBQ_ERR_INFO_UNKNOWN_CASE);
    }

    /**
     * init current user obj if login
     */
    public function initOCurMbqEtUser($userId) {
        if (MbqMain::$oMbqAppEnv->oCurJUser && MbqMain::$oMbqAppEnv->oCurKunenaUser) {
            MbqMain::$oCurMbqEtUser = $this->initOMbqEtUser(array('oJuser' => MbqMain::$oMbqAppEnv->oCurJUser, 'oKunenaUser' => MbqMain::$oMbqAppEnv->oCurKunenaUser), array('case' => 'JUserAndKunenaUser'));
        }
    }
    public function getUserType($oJUser, $oKunenaUser)
    {
        if($oKunenaUser->isAdmin())
        {
            return 'admin';
        }
        if($oKunenaUser->isModerator())
        {
            return 'mod';
        }
        if($oKunenaUser->isBanned())
        {
            return 'banned';
        }
        if($oKunenaUser->isBlocked() || $oKunenaUser->userid == 0 || $oJUser->block == 1)
        {
            return 'inactive';
        }
        return 'normal';
    }
    /**
     * get user display name
     *
     * @param  Object  $oMbqEtUser
     * @return  String
     */
    public function getDisplayName($oMbqEtUser) {
        if(MbqMain::$oMbqAppEnv->oKunenaConfig->username == 0)
        {
            return $oMbqEtUser->userName->oriValue;
        }
        return $oMbqEtUser->loginName->hasSetOriValue() ? $oMbqEtUser->loginName->oriValue : $oMbqEtUser->userName->oriValue;
        //return $oMbqEtUser->loginName->oriValue;
    }
    /**
     * the response should be bool to indicate if the username meet the forum requirement
     *
     * @param string $username
     */
    public function validateUsername($username){
        return true;
    }
    /**
     * the response should be bool to indicate if the password meet the forum requirement
     *
     * @param string $password
     */
    public function validatePassword($password){
		if (trim($password) == '')
        {
            return false;
        }
        $params = JComponentHelper::getParams('com_users');

		if (!empty($params))
		{
			$minimumLength    = $params->get('minimum_length');
			$minimumIntegers  = $params->get('minimum_integers');
			$minimumSymbols   = $params->get('minimum_symbols');
			$minimumUppercase = $params->get('minimum_uppercase');
            $valueLength = strlen($password);
            $valueTrim = trim($password);
            if (strlen($valueTrim) != $valueLength)
            {
                return false;
            }
            // Minimum number of integers required
            if (!empty($minimumIntegers))
            {
                $nInts = preg_match_all('/[0-9]/', $password, $imatch);

                if ($nInts < $minimumIntegers)
                {
                    return false;
                }
            }

            // Minimum number of symbols required
            if (!empty($minimumSymbols))
            {
                $nsymbols = preg_match_all('[\W]', $password, $smatch);

                if ($nsymbols < $minimumSymbols)
                {
                    return false;
                }
            }

            // Minimum number of upper case ASII characters required
            if (!empty($minimumUppercase))
            {
                $nUppercase = preg_match_all("/[A-Z]/", $password, $umatch);

                if ($nUppercase < $minimumUppercase)
                {
                    return false;
                }
            }

            // Minimum length option
            if (!empty($minimumLength))
            {
                if (strlen((string) $password) < $minimumLength)
                {
                    return false;
                }
            }
		}
        return true;
    }
       /**
     * forget_password this function should send the email password change to this user
     *
     * @return Array
     */
    public function forgetPassword($oMbqEtUser) {
        require_once JPATH_ROOT.DS.'components'.DS.'com_users'.DS.'helpers'.DS.'route.php';
        $user = $oMbqEtUser->mbqBind['oJuser'];
        // Check for a user.
		if (empty($user))
		{
			$this->setError(JText::_('COM_USERS_USER_NOT_FOUND'));

			return false;
		}

		// Make sure the user isn't blocked.
		if ($user->block)
		{
			$this->setError(JText::_('COM_USERS_USER_BLOCKED'));

			return false;
		}

		$config = JFactory::getConfig();

		// Assemble the login link.
		$itemid = UsersHelperRoute::getLoginRoute();
		$itemid = $itemid !== null ? '&Itemid=' . $itemid : '';
		$link = 'index.php?option=com_users&view=login' . $itemid;
		$mode = $config->get('force_ssl', 0) == 2 ? 1 : (-1);

		// Put together the email template data.
		$data = JArrayHelper::fromObject($user);
		$data['fromname'] = $config->get('fromname');
		$data['mailfrom'] = $config->get('mailfrom');
		$data['sitename'] = $config->get('sitename');
		$data['link_text'] = JRoute::_($link, false, $mode);
		$data['link_html'] = JRoute::_($link, true, $mode);

		$subject = JText::sprintf(
			'COM_USERS_EMAIL_USERNAME_REMINDER_SUBJECT',
			$data['sitename']
		);
		$body = JText::sprintf(
			'COM_USERS_EMAIL_USERNAME_REMINDER_BODY',
			$data['sitename'],
			$data['username'],
			$data['link_text']
		);

		// Send the password reset request email.
		$return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $user->email, $subject, $body);

		// Check for an error.
		if ($return !== true)
		{
			$this->setError(JText::_('COM_USERS_MAIL_FAILED'), 500);

			return false;
		}

		return true;
    }
    /**
     * return custom register fields needed.
     * Return null if not needed
     * sample result is array of fields like:
     * array(
    'name'        => 'name',
    'description' => 'description',
    'key'         => 'field_id',
    'type'        => input,textarea,drop,radio,cbox,
    'options'     => '',
    'format'      => '',
    )
     */
    public function getCustomRegisterFields()
    {

    }
}

