<?php

class OrderByCuentaContable
{
    public static function comprobante($comprobante)
    {
        return new self($comprobante);
    }

    public function __construct($comprobante)
    {
        $this->comprobante = $comprobante;
        $this->clave = null;
    }

    public function clave($clave)
    {
        $this->clave = $clave;

        return $this;
    }

    public function data()
    {
        $datosOrdenados = [];
        if ($this->comprobante->groupData() == null) {
            return false;
        }

        foreach ($this->comprobante->groupData() as $prestamo) {
            if (! is_object($prestamo)) {
                $prestamo = (object) $prestamo;
            }

            $datosOrdenados[$this->key][] = (new Warp([
                'monto' => $prestamo->monto,
                'cuenta_contable' => Parametros::getCuentaContable([
                    'clave' => $this->clave ? $this->clave : $this->key,
                    'escenario' => $this->comprobante->escenario,
                    'tipo_parametro' => $this->comprobante->groupScenario(),
                    'proceso' => $prestamo->id_tipo_credito,
                ]),
            ]))->flatten();
        }

        return $datosOrdenados;
    }

    public function groupBy($key)
    {
        $this->key = $key;
        $datosAgrupados = [];

        $datos = $this->data();
        if ($datos == null) {
            return [];
        }

        foreach ($datos as $cuenta => $prestamos) {
            $datosAgrupados[$cuenta] = (new Warp($prestamos))->groupBy('cuenta_contable');
        }

        $dataFinal = [];
        foreach ($datosAgrupados as $cuenta => $claves) {
            $dataFinal[$cuenta] = (new Warp($claves))->map(function ($datos) {
                return  [
                    'cuenta_contable' => $datos[0]['cuenta_contable'],
                    'monto' => (new Warp($datos))->sum('monto'),
                ];
            });
        }

        return $dataFinal[$this->key];
    }
}
