<?php

class ReversoMasivo extends Masivo
{
    protected $reverso = true;

    public function __construct($nomina)
    {
        parent::__construct($nomina);
    }

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

        $saldos = $this->getMontos();

        foreach ($saldos['debe'] as $saldo) {
            $movimiento->crear(
                $saldo['id_cuenta'],
                $saldo['monto_debe']
            );
        }

        foreach ($saldos['haber'] as $saldo) {
            $movimiento->crear(
                $saldo['id_cuenta'],
                0,
                $saldo['monto_haber']
            );
        }
    }

    protected function getMontos()
    {
        $comprobantePago = $this->nomina->getUltimoComprobante()->detalleComprobante;

        $debe = $this->flip($comprobantePago, 'monto_haber', 'monto_debe');
        $haber = $this->flip($comprobantePago, 'monto_debe', 'monto_haber');

        $saldosDebe = (new Warp($debe))->pluck('monto_debe');
        $saldosHaber = (new Warp($haber))->pluck('monto_haber');

        // $this->debug($saldosDebe, $saldosHaber);

        if (! $this->validate($saldosDebe, $saldosHaber)) {
            throw new Exception('Error comprobante descuadrado.', $this->codigo_error);
        }

        return [
            'debe' => $debe,
            'haber' => $haber,
        ];
    }

    protected function flip($movimientos, $from, $to)
    {
        $movimeintos = (new Warp($movimientos))->filter(function ($movimiento) use ($to) {
            return $movimiento->{$to} == 0;
        });

        return (new Warp($movimeintos))->map(function ($movimiento) use ($from, $to) {
            return [
                'id' => $movimiento->id,
                'id_cuenta' => $movimiento->id_cuenta,
                'referencia' => $movimiento->referencia,
                'clv_comprobante' => $movimiento->clv_comprobante,
                $to => $movimiento->{$from},
            ];
        });
    }

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

        $comprobante = new Comprobante();
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = "Reverso retiro masivo: {$this->nomina->descripcion}";
        $comprobante->status = 1;
        $comprobante->nro_documento = $this->nomina->num_comprobante;

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

        return $comprobante;
    }
}
