<?php

class CandidatoController 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/default';
    
    /**
        * @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',
                'actions' => array('index','view','create','update','delete','admin', 'updateEstado'),
                'users' => array('*'),
            ),
        );
        /*return array(
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                    'actions'=>array('index','view','create','update','delete','admin'),
                    'users'=>array('@'),
            ),
            array('deny',  // deny all users
                    'users'=>array('*'),
            ),
        );*/
    }
    
    public function actionGetDashboardPortlets() {
        $model=new Candidato('search');
        
        $portlet = array(
            'id' => 'actividad_candidatos',
            'header' => 'Resumen de actividad de candidatos (últimos 7 días)',
            'content' => $this->renderPartial('portlets/actividad', $model, true)
        );
        return $portlet;
    }
    
    

    /**
        * Displays a particular model.
        * @param integer $id the ID of the model to be displayed
        */
    public function actionView($id)
    {
        $this->layout='//layouts/candidato';
        $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()
    {
        Yii::import('ext.multimodelform.MultiModelForm');

        $model = new Candidato;            
        $idioma = new CandidatoIdioma();
        $titulacion = new CandidatoTitulacion();

        $idiomasValidos = array();
        $titulacionesValidas = array();

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

        if (isset($_POST['Candidato'])) {
            $model->attributes=$_POST['Candidato'];
            $foto=CUploadedFile::getInstance($model,'foto');

            $foundInvalidChild = false;
            if ($model->validate()) {                                        
                if (!MultiModelForm::validate($idioma, $idiomasValidos, $idiomasBorrados)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Algún idioma del candidato no es válido.'));
                    $foundInvalidChild = true;
                }

                if (!MultiModelForm::validate($titulacion, $titulacionesValidas, $titulacionesBorradas)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Alguna titulación del candidato no es válida.'));
                    $foundInvalidChild = true;                    
                }
            } else {
                Yii::app()->user->setFlash('error', Yii::t('intranet', 'Algún dato del candidato no es válido.'));
            }
            
            if (!$foundInvalidChild && $model->save() ) {                    
                $masterValues = array ('candidato_id'=>$model->id);

                if (!MultiModelForm::save($idioma, $idiomasValidos, $idiomasBorrados, $masterValues)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Se ha producido un error al guardar los idiomas del candidato.'));
                    $foundInvalidChild = true;
                }
                if (!MultiModelForm::save($titulacion, $titulacionesValidas, $titulacionesBorradas, $masterValues)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Se ha producido un error al guardar las titulaciones del candidato.'));
                    $foundInvalidChild = true;                    
                }
                
                if (!$foundInvalidChild) {
                    $this->guardarFoto($model->id, $foto);
                    Yii::app()->user->setFlash('success', Yii::t('intranet', 'Candidato dado de alta correctamente.'));
                    $url=$this->createUrl('view', array('id' => $model->id));
                    $this->redirect($url);
                }
            } else {
                Yii::app()->user->setFlash('error', Yii::t('intranet', 'Se ha producido un error al guardar el candidato.'));
            }
        }
       
        $this->render('create',array(
            'model'=>$model,
            'idioma'=>$idioma,
            'titulacion'=>$titulacion,
            'idiomasValidos'=>$idiomasValidos,
            'titulacionesValidas'=>$titulacionesValidas,
        ));     
    }

    /**
        * 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)
    {
        Yii::import('ext.multimodelform.MultiModelForm');	

        $model=$this->loadModel($id);
        $idioma=new CandidatoIdioma();
        $titulacion = new CandidatoTitulacion();

        $idiomasValidos = array();
        $titulacionesValidas = array();

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);
        
        if (isset($_POST['Candidato'])) {
            $model->attributes=$_POST['Candidato'];
            $foto=CUploadedFile::getInstance($model,'foto');

            $foundInvalidChild = false;
            if ($model->validate()) {                                        
                if (!MultiModelForm::validate($idioma, $idiomasValidos, $idiomasBorrados)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Algún idioma del candidato no es válido.'));
                    $foundInvalidChild = true;
                }

                if (!MultiModelForm::validate($titulacion, $titulacionesValidas, $titulacionesBorradas)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Alguna titulación del candidato no es válida.'));
                    $foundInvalidChild = true;                    
                }
            } else {
                Yii::app()->user->setFlash('error', Yii::t('intranet', 'Algún dato del candidato no es válido.'));
            }

            if (!$foundInvalidChild && $model->save() ) {                    
                $masterValues = array ('candidato_id'=>$model->id);

                if (!MultiModelForm::save($idioma, $idiomasValidos, $idiomasBorrados, $masterValues)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Se ha producido un error al guardar los idiomas del candidato.'));
                    $foundInvalidChild = true;
                }
                if (!MultiModelForm::save($titulacion, $titulacionesValidas, $titulacionesBorradas, $masterValues)) {
                    Yii::app()->user->setFlash('error', Yii::t('intranet', 'Se ha producido un error al guardar las titulaciones del candidato.'));
                    $foundInvalidChild = true;                    
                }
                
                if (!$foundInvalidChild) {
                    $this->guardarFoto($model->id, $foto);
                    Yii::app()->user->setFlash('success', Yii::t('intranet', 'Candidato modificado correctamente.'));
                    
                    if( Yii::app()->request->isAjaxRequest ) {
                        // Stop jQuery from re-initialization
                        Yii::app()->clientScript->scriptMap['jquery.js'] = false;
                        echo CJSON::encode( array(
                            'status' => 'success',
                            'content' => Yii::t('intranet', 'Candidato modificado correctamente.'),
                        ));
                        exit;
                    }
                    
                    $url=$this->createUrl('view', array('id' => $model->id));
                    $this->redirect($url);
                    
                }
            } else {
                Yii::app()->user->setFlash('error', Yii::t('intranet', 'Se ha producido un error al guardar el candidato.'));
                
                if( Yii::app()->request->isAjaxRequest ) {
                    // Stop jQuery from re-initialization
                    Yii::app()->clientScript->scriptMap['jquery.js'] = false;
                    echo CJSON::encode( array(
                        'status' => 'failure',
                        'content' => Yii::t('intranet', 'Se ha producido un error al guardar el candidato.'),
                    ));
                    exit;
                }
                
            }
        }

        $this->render('update',array(
            'model'=>$model,
            'idioma'=>$idioma,
            'titulacion'=>$titulacion,
            'idiomasValidos'=>$idiomasValidos,
            'titulacionesValidas'=>$titulacionesValidas,
        ));
    }
    
    public function actionUpdateEstado($id) {

        $model = $this->loadModel($id);

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

        if(isset($_GET['ajax']))
            var_dump($_GET['ajax']);
        
        if (isset($_POST['Candidato'])) {
            $model->id_estado = $_POST['Candidato']['id_estado'];
            
            if ($model->save()) {
                
            } else {
                
            }
        } else {
            echo $this->renderPartial('_form_estado', array('model' => $model, false, true));
        }
    }

    /**
        * 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)
    {
            if(Yii::app()->request->isPostRequest)
            {
                    // we only allow deletion via POST request
                    $this->loadModel($id)->delete();
                    $this->borrarFoto($id);
                    Yii::app()->user->setFlash('success', "Candidato eliminardo correctamente.");
                    // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
                    if(!isset($_GET['ajax']))
                            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
            }
            else
                    throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
    }

    /**
        * Lists all models.
        * 
        */
    public function actionIndex()
    {
        $model=new Candidato('search');
        $model->unsetAttributes();  // clear any default values

        if(isset($_GET['Candidato']))
                $model->attributes=$_GET['Candidato'];

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

    public function actionHistorial($id)
    {
        $this->layout='//layouts/candidato';
        $this->render('historial',array(
                'model'=>$this->loadModel($id),
        ));
    }
    
    
    /**
        * Manages all models.
        */
    public function actionAdmin()
    {
            $model=new Candidato('search');
            $model->unsetAttributes();  // clear any default values
            if(isset($_GET['Candidato']))
                    $model->attributes=$_GET['Candidato'];

            $this->render('admin',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=Candidato::model()->findByPk($id);
            if($model===null)
                    throw new CHttpException(404,'The requested page does not exist.');

            $model->foto = $this->buscarFoto($id);                
            return $model;
    }

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

    private function guardarFoto($id, $foto) {
        if (!is_null($foto)) {
            $path = Yii::app()->basePath.'/../fotos/';
            $fichero = $id.'.jpg';
            $foto->saveAs($path.$fichero);
        }
    }
    
    private function borrarFoto($id) {
        $path = Yii::app()->basePath.'/../fotos/';
        $fichero = $id.'.jpg';
        if (file_exists($path.$fichero))
            unlink($path.$fichero);
    }

    private function buscarFoto($id) {
        $path = Yii::app()->basePath.'/../fotos/';
        $fichero = $id.'.jpg';
        $url = Yii::app()->request->baseUrl.'/fotos/';
        return file_exists($path.$fichero) ? $url.$fichero : $url.'no_avatar.png';
    }
       
    /**
     * Calcula el valor para la columna 'Capacidad técnica' del grid
     * @param $data datos de la fila actual
     * @param $row índice de la fila actual
     */    
    protected function gridDataColumnCapacidadTecnica($data, $row)
    {        
        $lista = array();
        foreach ($data->capacidades as $capacidad) {
            $perfil = '<strong>' .$capacidad->perfilTecnico->descripcion . '</strong>';
            $meses = '(' . $capacidad->meses_perfil_tecnico . ' ' . Yii::t('intranet', 'meses') . ')';
            $tecnologias='';
            foreach($capacidad->tecnologias as $tecnologia ){
                if ($tecnologias == '') {
                  $tecnologias .= '<br/>Tecnologías: ';  
                }
                else{
                  $tecnologias .= ', ';  
                }
                    
                $tecnologias .= $tecnologia->tecnologia->descripcion;
                $tecnologias .= ' (' . $tecnologia->meses_tecnologia . ' ' . Yii::t('intranet', 'meses') . ') ';
            }
            $funciones='';
            foreach($capacidad->capacidadesFuncionales as $funcion ){
                if ($funciones == '') {
                  $funciones .= '<br/>Funcionalidades: ';  
                }
                else{
                  $funciones .= ', ';  
                }
                    
                $funciones .= $funcion->perfilFuncional->descripcion;
                $funciones .= ' (' . $funcion->meses_funcional . ' ' . Yii::t('intranet', 'meses') . ') ';
            }
            
            
            $lista[] = $perfil . (($meses != '()') ? $meses : '') . $tecnologias . $funciones . '<br/>';
            
        }
        $value = implode('<br/>', $lista);
        return ($value == NULL) ? CHtml::tag("span", array("class"=>"nodata"), Yii::t('intranet', 'Sin capacidades')) : $value;  
        
        
//        foreach ($data->capacidadesFuncionales as $funcionalidad) {
//            $perfil = $funcionalidad->perfilFuncional->descripcion;
//            $meses = '(' . $funcionalidad->meses_funcional . ' ' . Yii::t('intranet', 'meses') . ')';
//            $lista[] = $perfil . (($meses != '( '. Yii::t('intranet', 'meses') .')') ? '&nbsp;&nbsp;&nbsp;'. $meses : '');
        
    }               
    
    /**
     * Calcula el valor para la columna 'Capacidad funcional' del grid
     * @param $data datos de la fila actual
     * @param $row índice de la fila actual
     */    
    protected function gridDataColumnCapacidadFuncional($data, $row)
    {        
        $lista = array();
        /*foreach ($data->capacidades as $capacidad) {
            $perfil = $capacidad->capacidadesFuncionales->perfil;
            $lista[] = $perfil;
        }*/
        $value = implode('<br/>', $lista);
        return ($value == NULL) ? CHtml::tag("span", array("class"=>"nodata"), Yii::t('intranet', 'Sin capacidades')) : $value;        
    }
    
    public function darListaTitulaciones($model)
    {
        $lista = array();
        foreach ($model->titulaciones as $titulacion) {
            $lista[] = $titulacion->titulacion;
        }
        return $lista;
    }

    public function darListaIdiomas($model)
    {
        $lista = array();
        foreach ($model->idiomas as $idioma) {
            $lista[] = $idioma->idioma;
        }
        return $lista;
    }
    
}
?>