<?php
/**
* handles CMS/WWW related functions regarding user management & registration.
* inherits from the Users class. The methods of this class have to be rewritten according to the CMS's functionality that you wish to use.
* The drupal_module has a webusers class of its own in the module itself.
* @author Daan Janssens, mentored by Matthew Lagoe
*/
class WebUsers extends Users{

       private $uId; /**< The user id */ 
       private $login; /**< The username */ 
       private $email; /**< The email address */ 
       private $firstname; /**< The users first name */ 
       private $lastname; /**< The users last name */ 
       private $gender; /**< The gender */ 
       private $country; /**< 2 letter word matching the country of the user */ 
       private $receiveMail; /**< configuration regarding if the user wants to receive email notifications or not. */ 
       private $language; /**< Language of the user */ 
       
       
       /**
       * A constructor.
       * loads the object with the UID, if none is given it will use 0.
       * @param $UId the UID of the user you want to instantiate.
       */
       function __construct($UId = 0) {
              $this->uId = $UId;
       }
       
       
       /**
       * sets the object's attributes.
       * @param $values should be an array.
       */
       public function set($values){
              $this->uId = $values['UId'];
              $this->login = $values['Login'];
              $this->email = $values['Email'];
              $this->firstname = $values['FirstName'];
              $this->lastname = $values['LastName'];
              $this->gender = $values['Gender'];
              $this->country = $values['Country'];
              $this->receiveMail = $values['ReceiveMail'];
              $this->language = $values['Language'];
       }
    
    
       /**
       * function that checks if a username exists already or not.
       * This function overrides the function of the base class.
       * @param $username the username in question
       * @return string Info: Returns 0 if the user is not in the web db, else a positive number is returned.
       */
       protected function checkUserNameExists($username){
              $dbw = new DBLayer("web");
              return $dbw->select("ams_user", array('name' => $username), "Login = :name")->rowCount();  
       }
    
    
       /**
       * function that checks if a email exists already or not.
       * This function overrides the function of the base class.
       * @param $email the email address in question.
       * @return string Info: Returns 0 if the email address is not in the web db, else a positive number is returned.
       */
       protected function checkEmailExists($email){
              $dbw = new DBLayer("web");
              return $dbw->select("ams_user" ,array('email' => $email),"Email = :email")->rowCount();
       }
     
     
       /**
       * check if the login username/email and password match the db.
       * @param $value the inserted username or email
       * @param $password the inserted password (unhashed)
       * @return the logged in user's db row as array if login was a success, else "fail" will be returned.
       */
       public static function checkLoginMatch($value,$password){
  
          $dbw = new DBLayer("web");
          $statement = $dbw->select("ams_user", array('value' => $value),"Login=:value OR Email=:value");
          $row = $statement->fetch();
          $salt = substr($row['Password'],0,2);
          $hashed_input_pass = crypt($password, $salt);
          if($hashed_input_pass == $row['Password']){
                return $row;
          }else{
                return "fail";
          }	
       }
       
	   
       /**
       * returns the id for a given username
       * @param $username the username
       * @return the user's id linked to the username
       */
       public static function getId($username){
         $dbw = new DBLayer("web");  
         $statement = $dbw->select("ams_user", array('username' => $username), "Login=:username");
         $row = $statement->fetch();
         return $row['UId'];
       }
    
    
       /**
       * returns the id for a given emailaddress
       * @param $email the emailaddress
       * @return the user's id linked to the emailaddress
       */
       public static function getIdFromEmail($email){
          $dbw = new DBLayer("web");  
          $statement = $dbw->select("ams_user", array('email' => $email), "Email=:email");
          $row = $statement->fetch();
          if(!empty($row)){
              return $row['UId'];
          }else{
              return "FALSE";
          }
       }
	   
    
       /**
       * get uId attribute of the object.
       */
       public function getUId(){
              return $this->uId;
       }
    
    
       /**
       * get login attribute of the object.(username)
       */
       public function getUsername(){
          $dbw = new DBLayer("web");
          if(! isset($this->login) || $this->login == ""){
                $statement = $dbw->select("ams_user", array('id' => $this->uId), "UId=:id");
                $row = $statement->fetch();
                $this->set($row);
          }
          return $this->login;
       }
    
    
       /**
       * get email attribute of the object.
       */
       public function getEmail(){
          $dbw = new DBLayer("web");
          if(! isset($this->email) || $this->email == ""){
                 $statement = $dbw->select("ams_user", array('id' => $this->uId), "UId=:id");
                 $row = $statement->fetch();
                 $this->set($row);
          }
          return $this->email;
       }
       
       /**
       * get the  hashed password
       */
       public function getHashedPass(){
              $dbw = new DBLayer("web");
              $statement = $dbw->select("ams_user", array('id' => $this->uId), "UId=:id");
              $row = $statement->fetch();
              return $row['Password'];
       }
    
    
       /**
       * get basic info of the object.
       * @return returns an array in the form of Array('FirstName' => $this->firstname, 'LastName' => $this->lastname, 'Gender' => $this->gender, 'Country' => $this->country, 'ReceiveMail' => $this->receiveMail)
       */
       public function getInfo(){
          $dbw = new DBLayer("web");
          if(! (isset($this->firstname) && isset($this->lastname) && isset($this->gender) && isset($this->country) && isset($this->receiveMail) ) ||
             $this->firstname == "" || $this->lastname == "" || $this->gender == "" || $this->country == "" || $this->receiveMail == ""){
                $statement = $dbw->select("ams_user", array('id' => $this->uId), "UId=:id");
                $row = $statement->fetch();
                $this->set($row);
          }
          $result = Array('FirstName' => $this->firstname, 'LastName' => $this->lastname, 'Gender' => $this->gender, 'Country' => $this->country, 'ReceiveMail' => $this->receiveMail);
          return $result;
       }
    
    
       /**
       * get receiveMail attribute of the object.
       */
       public function getReceiveMail(){
              $dbw = new DBLayer("web");
              if(! isset($this->receiveMail) || $this->receiveMail == ""){
                     $statement = $dbw->select("ams_user", array('id' => $this->uId), "UId=:id");
                     $row = $statement->fetch();
                     $this->set($row);
              }
              return $this->receiveMail;
       }
    
    
       /**
       * get language attribute of the object.
       */
       public function getLanguage(){
              $dbw = new DBLayer("web");
              if(! isset($this->language) || $this->language == ""){
                     $statement = $dbw->select("ams_user", array('id' => $this->uId), "UId=:id");
                     $row = $statement->fetch();
                     $this->set($row);
              }
              return $this->language;
       }
    
    
       /**
       * check if the user is logged in.
       * @return true or false
       */
       public static function isLoggedIn(){
           if(isset($_SESSION['user'])){
               return true;
           }
           return false;
       }
    
    
       /**
       * update the password.
       * update the password in the shard + update the password in the www/CMS version.
       * @param $user the username
       * @param $pass the new password.
       * @return ok if it worked, if the lib or shard is offline it will return liboffline or shardoffline.
       */
       public static function setPassword($user, $pass){
              
              $hashpass = crypt($pass, WebUsers::generateSALT());
              $reply = WebUsers::setAmsPassword($user, $hashpass);
              $values = Array('pass' => $hashpass);
               try {
                     //make connection with and put into shard db
                     $dbw = new DBLayer("web");
                     $dbw->update("ams_user", $values,"Login = $user");
                }
                catch (PDOException $e) {
                  //ERROR: the web DB is offline
                }
              return $reply;
       }
       
    
       /**
       * update the emailaddress.
       * update the emailaddress in the shard + update the emailaddress in the www/CMS version.
       * @param $user the username
       * @param $mail the new emailaddress.
       * @return ok if it worked, if the lib or shard is offline it will return liboffline or shardoffline.
       */
       public static function setEmail($user, $mail){
          $reply = WebUsers::setAmsEmail($user, $mail);
          $values = Array('Email' => $mail);
           try {
                 //make connection with and put into shard db
                 $dbw = new DBLayer("web");
                 $dbw->update("ams_user", $values, "Login = '$user'");
            }
            catch (PDOException $e) {
              //ERROR: the web DB is offline
            }
          return $reply;
       }
    
    
       /**
       * update the setReceiveMail value in the db.
       * update the receiveMail in the www/CMS version.
       * @param $user the username
       * @param $receivemail the receivemail setting .
       */
       public static function setReceiveMail($user, $receivemail){
              $values = Array('Receivemail' => $receivemail);
              try {
                    //make connection with and put into shard db
                    $dbw = new DBLayer("web");
                    $dbw->update("ams_user", $values, "UId = $user" );	
              }
              catch (PDOException $e) {
                 //ERROR: the web DB is offline
              }
       }
    
    
       /**
       * update the language value in the db.
       * update the language in the www/CMS version.
       * @param $user the username
       * @param $language the new language value.
       */
      public static function setLanguage($user, $language){
              $values = Array('Language' => $language);
              try {
                    //make connection with and put into shard db
                    $dbw = new DBLayer("web");
                    $dbw->update("ams_user", $values, "UId = $user");
               }
               catch (PDOException $e) {
                 //ERROR: the web DB is offline
               }
       }
    
    
       /**
       * return all users.
       * @return return an array of users
       */
       public function getUsers(){
           $dbl = new DBLayer("web");
           $data = $dbl->executeWithoutParams("SELECT * FROM ams_user");
           return $data;
       }
    
    
       /**
       * return the query that should get all users.
       * @return string: the query to receive all users.
       */
       public static function getAllUsersQuery(){
          return "SELECT * FROM ams_user";
       }
    
    
       /**
       * creates a webuser.
       * it will set the language matching to the language cookie setting and add it to the www/CMS's DB.
       * @param $name the username
       * @param $pass the unhashed password
       * @param $mail the email address
       */
       public static function createWebuser($name, $pass, $mail){
          
          //register account with the correct language (check if cookie is already set)!
          if ( isset( $_COOKIE['Language'] ) ) { 
                 $lang = $_COOKIE['Language'];
          }else{
                 global $DEFAULT_LANGUAGE;
                 $lang = $DEFAULT_LANGUAGE;
          }
          
          $values = Array('Login' => $name, 'Password' => $pass, 'Email' => $mail, 'Language' => $lang);
          
          try {
             $dbw = new DBLayer("web");
             return $dbw->executeReturnId("ams_user", $values);
          }
          catch (PDOException $e) {
               //ERROR: the web DB is offline
          }
       }
    
}