<?php

class Group
{
    public function __construct($config)
    {
        $this->config = $config;
    }

    public function get()
    {
        $datos = $this->data();

        if (empty($datos)) {
            return [];
        }

        $datosAgrupados = [];
        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->config['by']];
    }

    public function data()
    {
        $datosOrdenados = [];

        if ($this->config['data'] == null || count($this->config['data']) == 0) {
            return [];
        }

        foreach ($this->config['data'] as $prestamo) {
            if (! is_object($prestamo)) {
                $prestamo = (object) $prestamo;
            }

            if ($prestamo->{$this->config['column']} > 0) {
                $datosOrdenados[$this->config['by']][] = (new Warp([
                    'monto' => $prestamo->{$this->config['column']},
                    'clave' => $this->config['by'],
                    'cuenta_contable' => Parametros::getCuentaContable([
                        'clave' => $this->config['by'],
                        'escenario' => $this->config['escenario'],
                        'tipo_parametro' => $this->config['tipo_parametro'],
                        'proceso' => $prestamo->{$this->proceso()},
                    ]),
                ]))->flatten();
            }
        }

        return $datosOrdenados;
    }

    protected function proceso()
    {
        if (! isset($this->config['proceso'])) {
            return 'id_tipo_credito';
        }

        return $this->config['proceso'];
    }
}
