<?php
/**
 * IMPORTANT NOTE
 * The code of this system is closed and a private proprietary of Flex Solutions.
 * A written authorization/license from Flex Solutions is required before using or modifying this code.
 * Email: sales@flexsolution.biz, Phone: +962795342585, Website: http://www.flexsolutions.biz
 */
 
/**
 *  User
 *
 * Yii controller to control User actions
 *
 * @version 1.0
 *
 * @author Amaney
 * @package application.controllers
 */
class UserController extends Controller {

    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/column2';

    /**
     * @return array action filters
     */
    public function filters() {
	return array(
	    'accessControl', // perform access control for CRUD operations
	);
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules() {
	return array(
	    array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array('index', 'view', 'create', 'update', 'delete', 'exportToExcel', 'getlocationInGeomarket'),
		'roles' => array(User::SYSTEM_ADMIN_ROLE),
	    ),
	    array('allow', // allow all users to perform 'index' and 'view' actions
		'actions' => array('ChangePassword'),
		'roles' => array(User::SYSTEM_ADMIN_ROLE, User::LOGISTICS_ADMIN_ROLE),
	    ),
	    array('deny', // deny all users
		'users' => array('*'),
	    ),
	);
    }

    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    public function actionView($id) {
	$this->render('view', array(
	    'model' => $this->loadModel($id),
	));
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate() {
	$model = new User;
	
	$model->status = 1;
	// The Following Scope For checking username as LDAP username after change value of username textbox
	if (isset($_POST['ajax']) && isset($_POST['username'])) {
	    $model->setScenario('ldap');
	    $model->username = $_POST['username'];
	    //Call manually usernameValidate , if result is not found on the LDAP system model  will have error
	    $model->usernameValidate("username", "");

	    if ($model->hasErrors()) {
		//Show error after username textbox as a span text
		echo'<span class="help-block error validateLDAP">' . $model->getError('username') . '</span>';
	    } else {
		//Return email for insert it in email text box
		echo $model->email;
	    }
	} else {
	    //The Following Scope For adding New User
	    if (isset($_POST['User'])) {

		$model->attributes = $_POST['User'];
		
		if ($model->type == "LDAP")
		    $model->setScenario('ldap');
		if ($model->save()) {
		    //Assign Role To Added User
		    $model->setRole($model->role);

		    Yii::app()->user->setFlash('success', Yii::t('default', 'The User has been added successfully'));
		    $this->redirect(array('index'));
		} else {
		    Yii::app()->user->setFlash('error', CHtml::errorSummary($model));
		}
	    }

	    $this->render('create', array(
		'model' => $model,
	    ));
	}
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id the ID of the model to be updated
     */
    public function actionUpdate($id) {
	$model = $this->loadModel($id);
	
	//The following tow line for setting the password and confirm password textboxes with value
	//And check value after submitting if user doesn't change password
	$model->old_password = $model->password;
	$model->password_repeat = $model->password;


	// Uncomment the following line if AJAX validation is needed
	// $this->performAjaxValidation($model);

	if (isset($_POST['User'])) {

	    $model->attributes = $_POST['User'];
	    
	    //$model->location_id = Location::getLocationIdByIdentifier($model->location_drop_down);
	    if ($model->save()) {

		//Change Assigned Role for User
		$model->setRole($model->role);

		Yii::app()->user->setFlash('success', Yii::t('default', 'The User has been updated successfully'));
		$this->redirect(array('index'));
	    } else {
		Yii::app()->user->setFlash('error', CHtml::errorSummary($model));
	    }
	}

	$this->render('update', array(
	    'model' => $model,
	));
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'admin' page.
     * @param integer $id the ID of the model to be deleted
     */
    public function actionDelete($id) {
	$model = $this->loadModel($id);
	$success_msg = Yii::t('default', 'The User ({n}) has been deleted successfully', $model->username);
	$failer_msg = Yii::t('default', 'You cannot delete this element because it is referenced by other element');
	try {
	    $model->delete();

	    //Delete Assigned Role for User
	    Yii::app()->authManager->revoke($model->role, $id);


	    if (!isset($_GET['ajax'])) { // Check Wether the data grid will be updated through AJAX or Not
		Yii::app()->user->setFlash('success', $success_msg);
	    } else {
		Yii::app()->user->setFlash('success', $success_msg);
		echo "<div class='flash-msg'>" . "<br>";
		$this->widget('bootstrap.widgets.TbAlert');
		echo "</div>";
	    }
	} catch (CDbException $e) { // here the item is referenced by another item
	    if (!isset($_GET['ajax'])) {
		Yii::app()->user->setFlash('error', $failer_msg);
	    } else {
		Yii::app()->user->setFlash('error', $failer_msg);
		echo "<div class='flash-msg'>" . "<br>";
		$this->widget('bootstrap.widgets.TbAlert');
		echo "</div>";
	    }
	}
	catch (Exception $e) { // here the item is referenced by another item
	    if (!isset($_GET['ajax'])) {
		Yii::app()->user->setFlash('error', $e->getMessage());
	    } else {
		Yii::app()->user->setFlash('error', $e->getMessage());
		echo "<div class='flash-msg'>" . "<br>";
		$this->widget('bootstrap.widgets.TbAlert');
		echo "</div>";
	    }
	}
    }

    /**
     * Lists all models.
     */
    public function actionIndex() {
	$model = new User('search');
	$model->unsetAttributes();  // clear any default values
	if (isset($_GET['User']))
	    $model->attributes = $_GET['User'];

	$this->render('index', array(
	    'model' => $model,
	));
    }

    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param integer the ID of the model to be loaded
     */
    public function loadModel($id) {
	$model = User::model()->findByPk($id);
	if ($model === null)
	    throw new CHttpException(404, 'The requested page does not exist.');
	return $model;
    }

    /**
     * Performs the AJAX validation.
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model) {
	if (isset($_POST['ajax']) && $_POST['ajax'] === 'user-form') {
	    echo CActiveForm::validate($model);
	    Yii::app()->end();
	}
    }

    /**
     * The Following Action is for Changing Password For user
     */
    public function actionChangePassword() {
	$model = new ChangePasswordForm();

	// if it is ajax validation request
	if (isset($_POST['ajax']) && $_POST['ajax'] === 'change-password-form') {
	    echo CActiveForm::validate($model);
	    Yii::app()->end();
	}

	//Collect user input data
	if (isset($_POST['ChangePasswordForm'])) {
	    $model->attributes = $_POST['ChangePasswordForm'];
	    if ($model->validate()) {

		$user = User::model()->findByAttributes(array('id' => Yii::app()->user->id));
		//Set password and confirm it at updated user
		$user->password = $model->new_password;
		$user->password_repeat = $model->password_repeat;
		if ($user->save()) {
		    Yii::app()->user->setFlash('success', Yii::t('default', "The password has been changed successfully."));
		} else {
		    Yii::app()->user->setFlash('error', CHtml::errorSummary($user));
		}
	    } else {
		Yii::app()->user->setFlash('error', CHtml::errorSummary($model));
	    }
	}
	// display the change password form
	$this->render('change_password', array('model' => $model));
    }

   

    /**
     * Export user info to excel
     */
    public function actionExportToExcel() {
	$model = new User('search');
	$model->unsetAttributes();  // clear any default values
	if (isset($_GET['User']))
	    $model->attributes = $_GET['User'];

        //Export Data to Excel File
        $header = array(
            'type'=>'Type',
            'username'=>'Username',
            'email'=>'Email',            
            'role'=>'Role',
            'status'=>'Status',
        );
        
        $column = "t.type,t.username,t.email,t.role,t.status";

        $excel_file_name = Yii::t('default', 'Users');
        $model->exportToExcel($excel_file_name, $model, $header, $column, $model->ModelCriteria());
    }

    

}
