<?php

class AjusteIndividual extends Utilidades
{
    protected $ajuste;
    protected $escenario = 11;
    protected $titulo_proceso = 14;
    protected $tipo_parametro_unidad = 1;
    protected $escenario_aporte_ordinario = 3;

    public function __construct($ajuste)
    {
        $this->ajuste = $ajuste;
        Yii::import('application.modules.contable.models.*', true);
        Yii::import('application.modules.contable.models.comprobantes.*', true);
    }

    public function contabilizar()
    {
        if (! ParamEscenarios::conectado($this->escenario)) {
            return;
        }

        ////////////////////////////////// COMPROBANTE /////////////////////////////////
        $comprobante = $this->comprobante();

        $this->seguimientoComprobante(
            $comprobante->id,
            $this->ajuste->id,
            null,
            $this->titulo_proceso
        );
        ////////////////////////// MOVIMIENTOS DEL COMPROBANTE /////////////////////////
        $this->movimientos($comprobante);
    }

    protected function saldos()
    {
        $debe = $this->debe();
        $haber = $this->haber();

        // $this->debug($debe, $haber);

        $this->validate($debe, $haber);

        return array_merge([], $debe, $haber);
    }

    protected function debe()
    {
        if ($this->ajuste->id_tipo_ajuste == 1) {
            return [
                'clv_ajuste_aporte_socio' => $this->ajuste->monto_asociado,
                'clv_ajuste_aporte_patrono' => $this->ajuste->monto_patrono,
            ];
        }

        return [
            'clv_concepto_ajuste' => $this->ajuste->totalAjuste(),
        ];
    }

    protected function haber()
    {
        if ($this->ajuste->id_tipo_ajuste == 1) {
            return [
                'clv_concepto_ajuste' => $this->ajuste->totalAjuste(),
            ];
        }

        return [
            'clv_ajuste_aporte_socio' => $this->ajuste->monto_asociado,
            'clv_ajuste_aporte_patrono' => $this->ajuste->monto_patrono,
        ];
    }

    protected function movimientos($comprobante)
    {
        $movimiento = new Movimiento(
            $comprobante,
            $this->ajuste->fecha_operacion
        );

        $saldos = $this->saldos();

        if ($this->ajuste->id_tipo_ajuste == 1) {
            return $this->deduccion($movimiento, $saldos);
        }

        return $this->asignacion($movimiento, $saldos);
    }

    protected function asignacion($movimiento, $saldos)
    {
        $movimiento->crear(
            CuentaConcepto::find($this->ajuste->id_concepto_ajuste),
            $saldos['clv_concepto_ajuste']
        );

        $unidad = $this->ajuste->idAsociado->idunidad;
        if ($saldos['clv_ajuste_aporte_socio'] > 0) {
            $movimiento->crear(
                Parametros::getCuentaContable([
                    'clave' => 'aport_rec_asociado',
                    'escenario' => $this->escenario_aporte_ordinario,
                    'tipo_parametro' => $this->tipo_parametro_unidad,
                    'proceso' => $unidad,
                ]),
                0,
                $saldos['clv_ajuste_aporte_socio']
            );
        }

        if ($saldos['clv_ajuste_aporte_patrono'] > 0) {
            $movimiento->crear(
                Parametros::getCuentaContable([
                    'clave' => 'aport_rec_patron',
                    'escenario' => $this->escenario_aporte_ordinario,
                    'tipo_parametro' => $this->tipo_parametro_unidad,
                    'proceso' => $unidad,
                ]),
                0,
                $saldos['clv_ajuste_aporte_patrono']
            );
        }
    }

    protected function deduccion($movimiento, $saldos)
    {
        $unidad = $this->ajuste->idAsociado->idunidad;
        if ($saldos['clv_ajuste_aporte_socio'] > 0) {
            $movimiento->crear(
                Parametros::getCuentaContable([
                    'clave' => 'aport_rec_asociado',
                    'escenario' => $this->escenario_aporte_ordinario,
                    'tipo_parametro' => $this->tipo_parametro_unidad,
                    'proceso' => $unidad,
                ]),
                $saldos['clv_ajuste_aporte_socio']
            );
        }

        if ($saldos['clv_ajuste_aporte_patrono'] > 0) {
            $movimiento->crear(
                Parametros::getCuentaContable([
                    'clave' => 'aport_rec_patron',
                    'escenario' => $this->escenario_aporte_ordinario,
                    'tipo_parametro' => $this->tipo_parametro_unidad,
                    'proceso' => $unidad,
                ]),
                $saldos['clv_ajuste_aporte_patrono']
            );
        }

        $movimiento->crear(
            CuentaConcepto::find($this->ajuste->id_concepto_ajuste),
            0,
            $saldos['clv_concepto_ajuste']
        );
    }

    protected function comprobante()
    {
        $this->setProceso($this->ajuste);

        $comprobante = new Comprobante('crea');
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = $this->descripcion();
        $comprobante->status = 1;
        $comprobante->nro_documento = $this->ajuste->idAsociado->cedula;

        if (! $comprobante->save()) {
            throw new Exception('Error: <strong>'.array_values($comprobante->getErrors())[0][0].'</strong>');
        }

        return $comprobante;
    }

    protected function descripcion()
    {
        return vsprintf('%s a %s', [
            $this->tipoAjuste(),
            $this->ajuste->idAsociado->nombreCompleto(),
        ]);
    }

    protected function tipoAjuste()
    {
        switch ($this->ajuste->id_tipo_ajuste) {
            case 1:
                return 'Deducción de haberes';
            case 2:
                return 'Asignación de haberes';
        }
    }
}
