<?php

class ReversoRetencionPorCobrar extends Utilidades
{
    public $nomina;
    public $escenario = 9;
    public $tipo_parametro = 3;
    private $datos = null;

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

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

        $this->setProceso($this->nomina);

        $comprobante = $this->comprobante([
            'fecha_comprobante' => $this->fechaComprobante(),
            'descripcion' => 'Reverso: '.$this->nomina->idUnidad->descripcion.' '.$this->nomina->descripcion,
            'status' => 1,
            'nro_documento' => $this->nomina->nombre_archivo,
        ]);

        $this->seguimientoComprobante(
            $comprobante->id,
            $this->nomina->id,
            null,
            6
        );

        $this->movimientos($comprobante);
    }

    protected function movimientos($comprobante)
    {
        $movimiento = new Movimiento(
            $comprobante,
            $this->nomina->idTipoMominaPeriodo->fecha_hasta
        );

        $this->validateSaldos();

        foreach ($this->datos['cta_rebaja_cartera_prestamos'] as $prestamo) {
            $movimiento->crear(
                $prestamo['cuenta_contable'],
                $prestamo['capital']
            );
        }

        foreach ($this->datos['cta_ingresos_interes'] as $prestamo) {
            $movimiento->crear(
                $prestamo['cuenta_contable'],
                $prestamo['interes']
            );
        }

        foreach ($this->datos['cta_x_cobrar_capital'] as $prestamo) {
            $movimiento->crear(
                $prestamo['cuenta_contable'],
                0,
                $prestamo['capital']
            );
        }

        foreach ($this->datos['cta_x_cobrar_interes'] as $prestamo) {
            $movimiento->crear(
                $prestamo['cuenta_contable'],
                0,
                $prestamo['interes']
            );
        }
    }

    protected function validateSaldos()
    {
        $this->setData();

        $debe = (new Warp([
            'cta_rebaja_cartera_prestamos' => $this->convert('cta_rebaja_cartera_prestamos', 'capital'),
            'cta_ingresos_interes' => $this->convert('cta_ingresos_interes', 'interes'),
        ]))->flatten();

        $haber = (new Warp([
            'cta_x_cobrar_capital' => $this->convert('cta_x_cobrar_capital', 'capital'),
            'cta_x_cobrar_interes' => $this->convert('cta_x_cobrar_interes', 'interes'),
        ]))->flatten();

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

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

    protected function comprobante($attributes)
    {
        $comprobante = new Comprobante();
        $comprobante->setAttributes($attributes);

        if (! $comprobante->save()) {
            throw new Exception('Error al generar comprobante contable.');
        }

        return $comprobante;
    }

    private function convert($clave, $key)
    {
        return (new Warp($this->datos[$clave]))->flatMap(function ($prestamo) use ($clave, $key) {
            return ["{$clave}_{$prestamo['cuenta_contable']}" => $prestamo[$key]];
        });
    }

    private function setData()
    {
        if ($this->datos == null) {
            $this->datos = (new Data($this))->run();
        }
    }
}
