<?php

class ReversoParcial extends Parcial
{
    public function __construct($retiro, $pago)
    {
        parent::__construct($retiro, $pago);
    }

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

        $comprobante = new Comprobante();
        $comprobante->fecha_comprobante = $this->fechaComprobante();
        $comprobante->descripcion = 'Reverso: '.$this->retiro->idAsociado->nombreCompleto();
        $comprobante->status = 1;
        $comprobante->nro_documento = $this->retiro->referencia;

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

        return $comprobante;
    }

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

        $saldos = $this->getMontos();

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

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

    protected function getMontos()
    {
        $comprobantePago = $this->retiro->getUltimoComprobanteDetalle();

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

        $saldosDebe = (new Warp($debe))->pluck('debe');
        $saldosHaber = (new Warp($haber))->pluck('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],
            ];
        });
    }
}
