<?php

/**
 * This is the model class for table "prestamos.conf_pre_nomina".
 *
 * The followings are the available columns in table 'prestamos.conf_pre_nomina':
 *
 * @property int $id
 * @property int $metodo_cobro_cuota
 */
class ConfPreNomina extends CActiveRecord
{
    public $metodo;

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'prestamos.conf_pre_nomina';
    }

    /**
     * @return array validation rules for model attributes
     */
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return [
            ['metodo_cobro_cuota', 'required'],
            ['metodo_cobro_cuota', 'numerical', 'integerOnly' => true],
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            [
                [
                    'id',
                    'metodo_cobro_cuota',
                    'metodo',
                    'adelantar_prenomina',
                    'id_metodo_distribucion',
                    'id_metodo_liberacion',
                ],
                'safe',
            ],
            ['id, metodo_cobro_cuota, metodo', 'safe', 'on' => 'search'],
        ];
    }

    /**
     * @return array relational rules
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return [
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'metodo_cobro_cuota' => 'Metodo Cobro Cuota',
            'adelantar_prenomina' => 'Adelantar prenómina',
        ];
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * Typical usecase:
     * - Initialize the model fields with values from filter form.
     * - Execute this method to get CActiveDataProvider instance which will filter
     * models according to data in model fields.
     * - Pass data provider to CGridView, CListView or any similar widget.
     *
     * @return CActiveDataProvider the data provider that can return the models
     *                             based on the search/filter conditions
     */
    public function search()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria = new CDbCriteria();
        $criteria->select = 't.*, mcc.nombre as metodo';
        $criteria->join = 'INNER JOIN prestamos.metodos_cobro_cuotas mcc on t.metodo_cobro_cuota=mcc.id';
        $criteria->compare('id', $this->id);
        $criteria->compare('mcc.nombre', $this->metodo);
        // $criteria->compare('metodo_cobro_cuota',$this->metodo_cobro_cuota);

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

    public function distribucionCuota($monto, $tabla)
    {
        $metodo = 1;

        if ($this->metodo_cobro_cuota != '') {
            $metodo = $this->metodo_cobro_cuota;
        }

        switch ($metodo) {
            case 1:
                return $this->recuperarCapital($monto, $tabla);
            case 2:
                return $this->recuperarInteres($monto, $tabla);
            case 3:
                return $this->recuperarCapitalConInteres($monto, $tabla);
            default:
                return [
                    'capital_pagado' => 0,
                    'capital_cobro' => 0,
                    'interes_pagado' => 0,
                    'interes_cobro' => 0,
                ];
        }
    }

    private function recuperarCapital($monto, $tabla)
    {
        $datos = [
            'capital_pagado' => 0,
            'capital_cobro' => 0,
            'interes_pagado' => 0,
            'interes_cobro' => 0,
        ];

        if ($monto == $tabla->monto_capital) {
            $datos['capital_pagado'] = $tabla->monto_capital;
            $datos['interes_cobro'] = $tabla->monto_interes;
        } elseif ($monto > $tabla->monto_capital) {
            $montoPago = $monto - $tabla->monto_capital;

            $datos['capital_pagado'] = $tabla->monto_capital;
            $datos['interes_pagado'] = $montoPago;
            $datos['interes_cobro'] = $tabla->monto_interes - $montoPago;
        } else {
            $datos['capital_pagado'] = $monto;
            $datos['capital_cobro'] = $tabla->monto_capital - $monto;
            $datos['interes_cobro'] = $tabla->monto_interes;
        }

        return $datos;
    }

    private function recuperarInteres($monto, $tabla)
    {
        $datos = [
            'capital_pagado' => 0,
            'capital_cobro' => 0,
            'interes_pagado' => 0,
            'interes_cobro' => 0,
        ];

        if ($monto == $tabla->monto_interes) {
            $datos['interes_pagado'] = $monto;
            $datos['capital_cobro'] = $tabla->monto_capital;
        } elseif ($monto > $tabla->monto_interes) {
            $montoPago = $monto - $tabla->monto_interes;

            $datos['interes_pagado'] = $tabla->monto_interes;
            $datos['capital_pagado'] = $montoPago;
            $datos['capital_cobro'] = $tabla->monto_capital - $montoPago;
        } else {
            $datos['interes_pagado'] = $monto;
            $datos['interes_cobro'] = $tabla->monto_interes - $monto;
            $datos['capital_cobro'] = $tabla->monto_capital;
        }

        return $datos;
    }

    private function recuperarCapitalConInteres($monto, $tabla)
    {
        $datos = [];

        if ($tabla->monto_cuota == $monto || $monto > $tabla->monto_cuota) {
            $datos['capital_pagado'] = $tabla->monto_capital;
            $datos['capital_cobro'] = 0;
            $datos['interes_pagado'] = $tabla->monto_interes;
            $datos['interes_cobro'] = 0;
        } else {
            $datos['capital_pagado'] = ($tabla->monto_capital * $monto) / $tabla->monto_cuota;
            $datos['capital_cobro'] = $tabla->monto_capital - $datos['capital_pagado'];
            $datos['interes_pagado'] = ($tabla->monto_interes * $monto) / $tabla->monto_cuota;
            $datos['interes_cobro'] = $tabla->monto_interes - $datos['interes_pagado'];
        }

        return $datos;
    }

    public static function getNumeroPeriodosDescargable($id)
    {
        $model = self::model()->find();

        if ($model->adelantar_prenomina) {
            if ($model->tipo_nomina != '') {
                $periodos = json_decode($model->tipo_nomina, true);

                if (isset($periodos[$id])) {
                    if ($periodos[$id] > 0) {
                        if ($id == 1) {
                            return "+ {$periodos[$id]} months";
                        } elseif ($id == 2) {
                            // $cantidad = floor( $periodos[$id] / 2 );
                            $cantidad = ($periodos[$id] * 2);

                            return "+ ${cantidad} weeks";
                        } elseif ($id == 3) {
                            return "+ {$periodos[$id]} weeks ";
                        } elseif ($id == 4) {
                            return "+ {$periodos[$id]} year";
                        }
                    }
                }
            }
        }

        return '+ 0 months';
    }

    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     *
     * @param string $className active record class name
     *
     * @return ConfPreNomina the static model class
     */
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    public static function config($key)
    {
        return static::model()->find()->getAttribute($key);
    }
}
