<?php

class ModelosContabilizacionController extends Controller
{
    public $layout = '//layouts/column2';

    public function filters()
    {
        return array(
            'accessControl',
            'postOnly + delete',
            array('CrugeAccessControlFilter'),
        );
    }

    public function accessRules()
    {
        return array(
            array(
                'allow',
                'actions' => array('index', 'view'),
                'users' => array('*'),
            ),
            array(
                'allow',
                'actions' => array(
                    'comportamientos',
                    'addVariable',
                    'removerVariable',
                    'categoria',
                    'crearCategoria',
                    'actualizarCategoria',
                    'updateCategoria',
                    'categorias',
                    'escenario',
                    'actualizarEscenario',
                    'updateEscenario',
                    'conectar',
                    'desconectar',
                    'crearEscenario',
                    'recordarSeleccion',
                    'contraerTodas',
                    'ActivarFechaComprobante',
                    'DesactivarFechaComprobante'
                ),
                'users' => array('@'),
            ),
            array(
                'allow',
                'actions' => array('admin', 'delete'),
                'users' => array('@'),
            ),
            array(
                'deny',
                'users' => array('*'),
            ),
        );
    }

    public function actionAdmin()
    {
        $this->render('admin', array(
            'categorias' => ParamCategorias::model()->findAll(['order' => 'denominacion']),
            'modelCategoria' => new ParamCategorias,
            'modelEscenario' => new ParamEscenarios,
        ));
    }

    public function actionComportamientos($id)
    {
        echo $this->renderModalComportamientos($id);
    }

    public function actionAddVariable()
    {
        if (! $_POST['isAjaxRequest']) {
            echo json_encode([
                'success' => false,
                'mensaje' => 'El tipo de petición es incorrecta.'
            ]);
        }

        $modelCategoria = $this->loadCategoria($_POST['id_categoria']);
        $res = $modelCategoria->addVariable($_POST['id_variable']);

        echo json_encode([
            'success' => $res,
            'form' => $this->renderModalComportamientos($_POST['id_categoria']),
        ]);
    }

    public function actionRemoverVariable()
    {
        if (! $_POST['isAjaxRequest']) {
            echo json_encode([
                'success' => false,
                'mensaje' => 'El tipo de petición es incorrecta.'
            ]);
        }
        $res = CategoriasVariables::model()->findByPk($_POST['id_registro'])->delete();

        echo json_encode([
            'success' => $res,
            'form' => $this->renderModalComportamientos($_POST['id_categoria']),
        ]);
    }

    public function actionCategoria()
    {
        echo json_encode([
            'form' => $this->renderPartial('_formCategoria', [
                'model' => new ParamCategorias
            ], true)
        ]);
    }

    public function actionCrearCategoria()
    {
        $model = new ParamCategorias;
        $model->denominacion = $_POST['nombre'];

        if (! $model->validate()) {
            echo json_encode([
                'success' => false,
                'mensaje' => $model->getError('denominacion')
            ]);
            return;
        }

        $model->save();

        echo json_encode([
            'success' => true,
            'mensaje' => null,
            'form' => $this->renderCategorias()
        ]);
    }

    public function actionActualizarCategoria()
    {
        echo json_encode([
            'form' => $this->renderPartial('_formCategoria', [
                'model' => ParamCategorias::model()->findByPk($_POST['id'])
            ], true)
        ]);
    }

    public function actionUpdateCategoria()
    {
        $model = ParamCategorias::model()->findByPk($_POST['id']);
        $model->denominacion = $_POST['nombre'];

        if (! $model->validate()) {
            echo json_encode([
                'success' => false,
                'mensaje' => $model->getError('denominacion'),
            ]);
            return;
        }

        $model->save();

        echo json_encode([
            'success' => true,
            'mensaje' => null,
            'categorias' => $this->renderCategorias()
        ]);
    }

    public function actionEscenario($id)
    {
        echo json_encode([
            'form' => $this->renderPartial('_viewEscenario', array(
                'model' => ParamEscenarios::model()->findByPk($id),
            ), true)
        ]);
    }

    public function actionActualizarEscenario()
    {
        echo json_encode([
            'form' => $this->renderPartial('_formEscenarios', [
                'model' => ParamEscenarios::model()->findByPk($_POST['id'])
            ], true)
        ]);
    }

    public function actionUpdateEscenario()
    {
        $model = ParamEscenarios::model()->findByPk($_POST['id']);
        $model->descripcion = $_POST['nombre'];
        $model->id_tipo_parametro = $_POST['id_tipo_parametro'];

        if (! $model->validate()) {
            echo json_encode([
                'success' => false,
                'mensaje' => $model->getError('descripcion'),
            ]);
            return;
        }

        $model->save();

        echo json_encode([
            'success' => true,
            'mensaje' => null,
            'escenarios' => $this->renderEscenarios($_POST['id_categoria'])
        ]);
    }

    public function actionConectar()
    {
        $model = ParamEscenarios::model()->findByPk($_POST['id_escenario']);
        $model->conectado = true;
        $model->id_usuario = Yii::app()->user->id;
        $model->fecha_registro = date('Y-m-d H:i:s');

        echo json_encode([
            'success' => $model->save(),
            'escenarios' => $this->renderEscenarios($_POST['id_categoria'])
        ]);
    }

    public function actionDesconectar()
    {
        $model = ParamEscenarios::model()->findByPk($_POST['id_escenario']);
        $model->conectado = false;
        $model->id_usuario = Yii::app()->user->id;
        $model->fecha_registro = date('Y-m-d H:i:s');
        $model->save();

        echo json_encode([
            'success' => $model->save(),
            'escenarios' => $this->renderEscenarios($_POST['id_categoria'])
        ]);
    }

    public function actionActivarFechaComprobante()
    {
        $model = ParamEscenarios::model()->findByPk($_POST['id_escenario']);
        $model->fecha_comprobante = true;
        $model->id_usuario = Yii::app()->user->id;
        $model->fecha_registro = date('Y-m-d H:i:s');
        $model->save();

        echo json_encode([
            'success' => $model->save(),
            'escenarios' => $this->renderEscenarios($_POST['id_categoria'])
        ]);
    }

    public function actionDesactivarFechaComprobante()
    {
        $model = ParamEscenarios::model()->findByPk($_POST['id_escenario']);
        $model->fecha_comprobante = false;
        $model->id_usuario = Yii::app()->user->id;
        $model->fecha_registro = date('Y-m-d H:i:s');
        $model->save();

        echo json_encode([
            'success' => $model->save(),
            'escenarios' => $this->renderEscenarios($_POST['id_categoria'])
        ]);
    }

    public function actionCrearEscenario()
    {
        $model = new ParamEscenarios;
        $model->descripcion = $_POST['nombre'];
        $model->id_categoria = $_POST['id_categoria'];
        $model->id_usuario = Yii::app()->user->id;

        if (! $model->validate()) {
            echo json_encode([
                'success' => false,
                'mensaje' => array_values($model->getErrors())[0][0]
            ]);
            return;
        }

        $model->save();

        echo json_encode([
            'success' => true,
            'mensaje' => null,
            'escenarios' => $this->renderEscenarios($_POST['id_categoria'])
        ]);
    }

    public function actionRecordarSeleccion()
    {
        if ($_POST['type'] == 1) {
            Yii::app()->session['categoria_seleccionada'] = json_encode($_POST);
        }

        echo Yii::app()->session['categoria_seleccionada'];
    }

    public function actionContraerTodas()
    {
        unset(Yii::app()->session['categoria_seleccionada']);
    }

    private function loadCategoria($id)
    {
        $model = ParamCategorias::model()->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

    private function renderModalComportamientos($id)
    {
        $comportamientos = Yii::app()->db->createCommand('
            SELECT va.id,
                   va.nombre,
                   CASE coalesce(cv.id_variable::boolean, FALSE)
                       WHEN TRUE THEN TRUE
                       ELSE FALSE
                   END AS activada,
                   CASE coalesce(cv.id_variable::boolean, FALSE)
                       WHEN TRUE THEN TRUE
                       ELSE FALSE
                   END AS accion,
                   cv.id as id_registro
            FROM contable.variables_asientos va
            LEFT JOIN contable.categorias_variables cv ON cv.id_variable=va.id AND cv.id_categoria=:id
        ')->bindValue('id', $id)->queryAll();

        return $this->renderPartial('comportamientos', [
            'comportamientos' => $comportamientos,
            'id_categoria' => $id
        ], true);
    }

    private function renderCategorias()
    {
        return $this->renderPartial('_categorias', array(
            'categorias' => ParamCategorias::model()->findAll(['order' => 'denominacion']),
            'modelEscenario' => new ParamEscenarios,
        ), true);
    }

    private function renderEscenarios($categoria)
    {
        return $this->renderPartial('_gridEscenarios', [
            'categoria' => ParamCategorias::model()->findByPk($categoria),
            'modelEscenario' => new ParamEscenarios,
        ], true);
    }
}
