<?php

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

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

    public function accessRules()
    {
        return [
            ['allow',
                'actions' => ['index', 'view'],
                'users' => ['*'],
            ],
            ['allow',
                'actions' => ['admin', 'create', 'update', 'delete', 'autocomplete', 'escenarioClaves'],
                'users' => ['@'],
            ],
            ['deny',
                'users' => ['*'],
            ],
        ];
    }

    public function actionAutocomplete($term)
    {
        $criteria = new CDbCriteria();
        $criteria->compare('LOWER(descripcion)', strtolower($_GET['term']), true);
        $criteria->compare('LOWER(codigo_cuenta)', strtolower($_GET['term']), true, 'OR');
        $criteria->addCondition('titulo_mov=2 and nivel>3 and blnborrado=false');
        $criteria->order = 'codigo_cuenta';
        $criteria->limit = 30;
        $data = CuentasConsolidada::model()->findAll($criteria);

        if (! empty($data)) {
            $arr = [];
            foreach ($data as $item) {
                $arr[] = [
            'id' => $item->id,
            'value' => $item->codigo_cuenta.'-'.$item->descripcion,
            'label' => $item->codigo_cuenta.'-'.$item->descripcion,
           ];
            }
        } else {
            $arr = [];
            $arr[] = [
           'id' => '',
           'value' => 'No se han encontrado resultados para su búsqueda',
           'label' => 'No se han encontrado resultados para su búsqueda',
          ];
        }

        echo CJSON::encode($arr);
    }

    public function actionAdmin()
    {
        $model = new Parametros();
        $model->scenario = 'crear';

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

            if (! $this->validateMovimiento($_POST['config'])) {
                echo json_encode([
                    'success' => false,
                    'mensaje' => 'Debe definir cuentas contables para los movimientos del modelo contable.',
                ]);

                return;
            }

            $claves = (new Warp($_POST['config']['claves']))->filter(function ($movimiento) {
                return $movimiento['cuenta'] !== '';
            });

            (new Warp($claves))->map(function ($movimiento) {
                switch ($movimiento['type']) {
                    case 1: // Crear
                        return $this->createConfig($movimiento, $_POST['config']);
                    case 2: // Actualizar
                        return $this->updateConfig($movimiento, $_POST['config']);
                }
            });

            echo json_encode([
                'success' => true,
                'form' => $this->renderPartial('_claves', [
                    'model' => new Parametros(),
                    'data' => ParametrosContables::getClaves($_POST['config']),
                ], true),
            ]);

            return;
        }

        $this->render('admin', [
            'model' => $model,
        ]);
    }

    public function actionEscenarioClaves()
    {
        if (empty($_POST['id_escenario']) || empty($_POST['id_tipo_parametro']) || empty($_POST['id_proceso'])) {
            echo json_encode([
                'error' => true,
                'mensaje' => 'Los campos requeridos no pueden ser nulos.'
            ]);
            return;
        }

        echo json_encode([
            'error' => false,
            'form' => $this->renderPartial('_claves', [
                'model' => new Parametros(),
                'data' => ParametrosContables::getClaves($_POST),
            ], true)
        ]);
    }

    private function validateMovimiento($data)
    {
        if (! isset($data['claves'])) {
            return false;
        }

        $claves = (new Warp($data['claves']))->filter(function ($movimiento) {
            return $movimiento['cuenta'] !== '';
        });

        if (count($claves) == 0) {
            return false;
        }

        return true;
    }

    private function createConfig($movimiento, $request)
    {
        $model = new Parametros();
        $model->scenario = 'crear';
        $model->attributes = $request;
        $model->id_clave = $movimiento['id_clave'];
        $model->cuenta_descripcion = $movimiento['cuenta'];

        $cuenta = explode('-', $movimiento['cuenta']);
        $padre = CuentasConsolidada::model()->find('"codigo_cuenta"=:id and blnborrado is false', [':id' => $cuenta[0]]);

        if ($padre) {
            $model->id_cuenta = $padre->id;
        }

        $model->save();
    }

    private function updateConfig($movimiento, $request)
    {
        $model = Parametros::model()->findByAttributes([
            'id_clave' => $movimiento['id_clave'],
            'id_escenario' => $request['id_escenario'],
            'id_proceso' => $request['id_proceso'],
            'id_tipo_parametro' => $request['id_tipo_parametro'],
            'blnborrado' => false,
        ]);

        $cuenta = explode('-', $movimiento['cuenta']);
        $cuentaContable = CuentasConsolidada::model()->find('"codigo_cuenta"=:id and blnborrado is false', [':id' => $cuenta[0]]);

        if ($cuentaContable) {
            $model->id_cuenta = $cuentaContable->id;
        }

        $model->save();
    }
}
