<?php

class sfMyUser extends sfBasicSecurityUser
{
  public function initialize($context, $parameters = null)
  {
    parent::initialize($context, $parameters);

    $storage = $this->getContext()->getStorage();
    $time = $storage->read(parent::LAST_REQUEST_NAMESPACE);
    if ($time == null && !$this->isAuthenticated()) $this->autoLogin();

    if ($this->isAuthenticated()) {
      $ip = myUtility::getRealIpAddr();
      $storeip = $this->getAttribute('userip', null, 'user');
      if ($storeip == null) $this->setAttribute('userip', $ip, 'user');
      else if ($storeip != $ip) {
        $this->setAuthenticated(false);
        session_regenerate_id(true);
      }
    }
  }

  public function rememberLogin($user, $remember = false) {
    $value = $remember? base64_encode(serialize(array($user->getUsKey(), $user->getUsId()))): '';
    sfContext::getInstance()->getResponse()->setCookie('tvtl', $value, time() + 86400*15, '/');
  }

  public function autoLogin() {
    $remember = sfContext::getInstance()->getRequest()->getCookie('tvtl');
    if (!$remember) return;
    $info = unserialize(base64_decode($remember));
    if (is_array($info) && count($info)==2) {
      $c = new Criteria();
      $c->add(TbluserPeer::US_KEY, $info[0]);
      $c->add(TbluserPeer::US_ID, $info[1]);
      $tbluser = TbluserPeer::doSelectOne($c);
      try {
        if ($tbluser!=null) $this->signIn($tbluser);
      } catch (Exception $e) {}
    }
  }

  public function signIn($user) {
    $user->getObject()->checkUserLock();
    if (class_exists('sfDatabaseSessionStorage', false)) sfDatabaseSessionStorage::kickUserByName($user->getUsUsername());
    $this->setAuthenticated(true);
    $this->setAttribute('userid', $user->getUsId(), 'user');
    $this->setAttribute('username', $user->getUsUsername(), 'user');
    $this->setAttribute('userfullname', $user->getUsFullname(), 'user');
    $this->setAttribute('usertitle', $user->getObject()->getTitle(), 'user');
    $this->setAttribute('aclgroup', $user->getUsAclgroup(), 'user');
    $this->setAttribute('password', $user->getUsPassword(), 'user');

    if ($user->getUsAclgroup()=='1' || $user->getUsAclgroup()=='2') {
        $this->addCredential('moderator');
    }
    $this->addCredential('user');
    $user->getObject()->onLogin();
  }

  public function signOut()
  {
    onlineUser::getInstance()->removeCurrentUser();
    $this->getAttributeHolder()->removeNamespace('user');

    $this->clearVote();
    $this->clearBlogmember();
    $this->setAuthenticated(false);
    $this->clearCredentials();
  }

  public function isAdministrator()
  {
  	return $this->isAuthenticated() && $this->getAttribute('aclgroup', '', 'user') == '1';
  }

  public function getUserId() {
    if ($this->isAuthenticated()) return $this->getAttribute('userid', '', 'user');
    else return 0;
  }

  public function getUserName() {
    if ($this->isAuthenticated()) return $this->getAttribute('username', '', 'user');
    else return '';
  }

  public function getUserFullname() {
    if ($this->isAuthenticated()) return $this->getAttribute('userfullname', '', 'user');
    else return '';
  }

  public function getUserTitle() {
    if ($this->isAuthenticated()) return $this->getAttribute('usertitle', '', 'user');
    else return '';
  }

  /**
   * return type of sort of current user (date/download/rate)
   */
  public function getUserSort() {
    $request = sfContext::getInstance()->getRequest();
    $sort = $request->getCookie('sort');
    $sort = $request->getParameter('sort');
    if ($sort==null) $sort = $request->getCookie('sort', 'date');
    else sfContext::getInstance()->getResponse()->setCookie('sort', $sort);
    return $sort;
  }

  public function setUserSort($sort) {
    if ($sort == '') {
      $sort = $this->getRequest()->getCookie('sort');
      if ($sort != null) return;
      $sort = 'date';
    }
    sfContext::getInstance()->getResponse()->setCookie('sort', $sort, time()+60*60*24*15, '/');
  }

  public function setIsRegistering($referer) {
    if ($referer==null) {
      $referer = sfContext::getRequest()->getReferer();
    }
    return $this->setAttribute('regrefer', $referer, 'user');
  }

  public function getIsRegistering() {
    return null!=$this->getAttribute('regrefer', null, 'user');
  }

  public function getRegisterReferer() {
    return $this->getAttribute('regrefer', null, 'user');
  }

  public function hasCredential($credentials, $useAnd = true)
  {
    $ret = true;
    if ((is_array($credentials) && $i = in_array('blogadmin', $credentials)) || $credentials=='blogadmin') {
      $ret = $this->isAdministrator() || (blogStore::$userId == blogStore::$blog->getBlUser());
      if (@$i) unset($credentials[$i]); else $credentials = array();
    }
    return $ret && sfBasicSecurityUser::hasCredential($credentials, $useAnd);
  }

  /**
   * return true if this user is member of blog
   *
   * @return bool
   */
  public function isBlogMember() {
    if (!class_exists('blogStore')) return false;
    if (!$this->isAuthenticated()) return false;
    $isMember = $this->getAttribute('ismember'.blogStore::$blogId);
    if ($isMember===null) {
      $tblbloguser = TblbloguserPeer::retrieveByPK(blogStore::$blogId, blogStore::$userId);
      if ($tblbloguser == null) {
        $this->setIsBlogMember(false);
      } else {
        $this->setIsBlogMember($tblbloguser->getUsRole());
      }
      return $this->getAttribute('ismember'.blogStore::$blogId);
    } else return $isMember;
  }

  /**
   * Set current user is member of blog ($user_id==1) or not ($user_id==0)
   *
   * @param unknown_type $user_id
   */
  public function setIsBlogMember($is_member) {
    $this->setAttribute('ismember'.blogStore::$blogId, $is_member);
  }

  /**
   * Clear blogmember cookie information
   *
   */
  public function clearBlogmember() {
    if (!class_exists('blogStore')) return;
    $this->getAttributeHolder()->remove('ismember'.blogStore::$blogId);
  }

  /**
   * return status vote
   * false: never vote yet
   * true: voted
   * null: Nothing to vote
   */
  public function isVote() {
    if (blogStore::$tblblogpoll==null) return null;
    $cookieName = 'isvote'.blogStore::$tblblogpoll->getPollId();
    $isvote = $this->getAttribute($cookieName);
    if ($isvote === null) {
      $c = new Criteria();
      $c->add(TblblogpolldataPeer::PD_POLL, blogStore::$tblblogpoll->getPollId());
      $c->add(TblblogpolldataPeer::PD_IP, $_SERVER['REMOTE_ADDR']);
      $num = TblblogpolldataPeer::doCount($c);
      $this->setAttribute($cookieName, $num>0?1:0);
      return $num>0;
    } else return $isvote==1;
  }

  public function clearVote() {
    if (!class_exists('blogStore')) return;
    if (blogStore::$tblblogpoll==null) return;
    $cookieName = 'isvote'.blogStore::$tblblogpoll->getPollId();
    $this->getAttributeHolder()->remove($cookieName);
  }
}
