<?php

class Parametros extends CActiveRecord
{
    public $clave;
    public $cuenta;
    public $proceso;
    public $codigo_cuenta;
    public $nombre_escenario;
    public $cuenta_descripcion;
    public $nombre_tipo_parametro;

    public function tableName()
    {
        return 'contable.parametros';
    }

    public function rules()
    {
        return [
            ['id_cuenta, id_proceso, id_tipo_parametro', 'numerical', 'integerOnly' => true],
            ['id_cuenta, id_proceso,id_escenario, id_clave, id_tipo_parametro', 'required'],
            ['id_cuenta, id_proceso, id_escenario, cuenta_descripcion', 'required', 'on' => 'crear'],
            ['blnborrado', 'safe'],
            ['id ,pc ,p ,tp ,proceso ,cuenta ,nombre_escenario', 'safe', 'on' => 'search'],
        ];
    }

    public function relations()
    {
        return [
            'cuenta' => [self::BELONGS_TO, 'CuentasConsolidada', 'id_cuenta'],
            'unid' => [self::BELONGS_TO, 'Unidad', 'id_proceso'],
            'Escenario' => [self::BELONGS_TO, 'ParamEscenarios', 'id_escenario'],
            'clave' => [self::BELONGS_TO, 'ParametrosContables', 'id_clave'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'id_cuenta' => 'Cuenta contable',
            'id_proceso' => 'Proceso',
            'id_escenario' => 'Escenario',
            'id_tipo_parametro' => 'Tipo parámetro',
            'blnborrado' => 'Blnborrado',
            'id_clave' => 'Clave',
        ];
    }

    public function search()
    {
        $criteria = $this->getCriteria();

        $criteria->compare('pc.clave', $this->clave);
        $criteria->compare('p.id_tipo_parametro', $this->id_tipo_parametro);
        $criteria->compare('tp.nombre', $this->nombre_tipo_parametro);
        $criteria->compare('proceso', $this->proceso);
        $criteria->compare('cuenta', $this->cuenta);
        $criteria->compare('nombre_escenario', $this->nombre_escenario);
        $criteria->compare('p.id_escenario', $this->id_escenario);
        $criteria->compare('p.blnborrado', false);

        return new CActiveDataProvider($this, [
            'criteria' => $criteria,
        ]);
    }

    public function searchPorEscenario($id_escenario, $clave)
    {
        $criteria = $this->getCriteria();

        $criteria->compare('pc.clave', $this->clave);
        $criteria->compare('p.id_tipo_parametro', $this->id_tipo_parametro);
        $criteria->compare('tp.nombre', $this->nombre_tipo_parametro);
        $criteria->compare('proceso', $this->proceso);
        $criteria->compare('cuenta', $this->cuenta);
        $criteria->compare('nombre_escenario', $this->nombre_escenario);
        $criteria->compare('p.id_escenario', $this->id_escenario);
        $criteria->compare('p.blnborrado', false);
        $criteria->addCondition("p.id_escenario={$id_escenario}");
        $criteria->addCondition("p.id_clave={$clave}");

        return new CActiveDataProvider($this, [
            'criteria' => $criteria,
        ]);
    }

    public function concatenar($campo1, $campo2)
    {
        return $campo1.'-'.$campo2;
    }

    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    public static function getCuentaContable($datos)
    {
        $config = Yii::app()->getDb()->createCommand('
            SELECT CASE pc.conf_unidad
                    WHEN FALSE THEN pc.valor::varchar
                    WHEN TRUE THEN
                        (SELECT cc.id
                        FROM contable.parametros p
                        INNER JOIN contable.cuentas_consolidada cc ON cc.id=p.id_cuenta
                        WHERE p.id_clave=pc.id
                          AND p.id_escenario=:escenario
                          AND p.id_tipo_parametro=:tipo_parametro
                          AND p.id_proceso=:proceso
                          AND p.blnborrado IS FALSE)::varchar
                END AS valor
            FROM contable.param_contables pc
            WHERE pc.clave=:clave;
        ')->bindValues($datos)->queryRow();

        if (! $config['valor']) {
            throw self::errorSinCuentaContable($datos);
        }

        return $config['valor'];
    }

    private function getCriteria()
    {
        $criteria = new CDbCriteria();
        $criteria->select = 'p.id,
                             p.id_clave,
                             pc.clave,
                             p.id_tipo_parametro,
                             tp.nombre as nombre_tipo_parametro,
                             p.id_proceso,
                             case p.id_tipo_parametro
                                when 1 then (select descripcion from unidad where idunidad=p.id_proceso)
                                when 2 then (select descripcion from prestamos.afianzadora where id=p.id_proceso)
                                when 3 then (select descripcion from prestamos.tipo_credito where id=p.id_proceso)
                             end as proceso,
                             p.id_cuenta,
                             concat(cc.codigo_cuenta, \' - \', cc.descripcion) as cuenta,
                             p.id_escenario,
                             pe.descripcion as nombre_escenario,
                             p.blnborrado';
        $criteria->alias = 'p';
        $criteria->join = 'inner join  contable.tipo_parametro tp on p.id_tipo_parametro=tp.id ';
        $criteria->join .= 'inner join contable.param_contables pc on p.id_clave=pc.id ';
        $criteria->join .= 'inner join contable.cuentas_consolidada cc on p.id_cuenta=cc.id ';
        $criteria->join .= 'inner join contable.param_escenarios pe on p.id_escenario=pe.id_escenario ';
        $criteria->condition = 'p.blnborrado is false';
        $criteria->order = 'p.id ASC';

        return $criteria;
    }

    private static function errorSinCuentaContable($datos)
    {
        $escenario = ParamEscenarios::model()->findByPk($datos['escenario']);

        switch ($datos['tipo_parametro']) {
            case 1:
                $proceso = Unidad::model()->findByPk($datos['proceso']);
                $el = 'la unidad';
                break;
            case 2:
                $proceso = Afianzadora::model()->findByPk($datos['proceso']);
                $el = 'la afianzadora';
                break;
            case 3:
                $proceso = TipoCredito::model()->findByPk($datos['proceso']);
                $el = 'el préstamo';
                break;
        }

        $mensaje = vsprintf('Error: %s <strong>%s</strong> no tiene una cuenta auxiliar definidad para el escenario <strong>%s</strong> con la clave <strong>%s</strong>.', [
            $el,
            $proceso->descripcion,
            $escenario->descripcion,
            $datos['clave'],
        ]);

        return new Exception($mensaje);
    }
}
