<?php

class Data
{
    private $comprobante;

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

    public function run()
    {
        $dataCuentasContables = $this->setCuentaContable();

        $datosAgrupados = [];
        foreach ($dataCuentasContables 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'],
                    'capital' => (new Warp($datos))->sum('capital'),
                    'interes' => (new Warp($datos))->sum('interes'),
                ];
            });
        }

        return $dataFinal;
    }

    private function getData()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT tc.id as id_tipo_credito,
                   sum(monto_capital) as capital,
                   sum(monto_interes) as interes
            FROM prestamos.pre_nomina_tabla_amortizacion as pnta
            JOIN prestamos.credito_tabla_amortizacion cta on pnta.id_tabla_amortizacion=cta.id
            JOIN prestamos.credito c on cta.idcredito=c.id
            JOIN prestamos.tipo_credito tc on c.id_tipo_credito=tc.id
            LEFT JOIN prestamos.titulo_tipo_credito ttc on tc.id_titulo_tipo_credito=ttc.id
            WHERE id_pre_nomina_credito=:id
            GROUP BY tc.id,
                     nombre_titulo
            ORDER by nombre_titulo,
                     sum(monto_cuota)
        ')->bindValues([
            'id' => $this->comprobante->nomina->id,
        ])->queryAll();
    }

    private function setCuentaContable()
    {
        $data = $this->getData();
        $dataCuentasContables = [];
        foreach ($data as $prestamo) {
            $dataCuentasContables['cta_x_cobrar_capital'][] = (new Warp([
                'capital' => $prestamo['capital'],
                'interes' => $prestamo['interes'],
                'cuenta_contable' => Parametros::getCuentaContable([
                    'clave' => 'cta_x_cobrar_capital',
                    'escenario' => $this->comprobante->escenario,
                    'tipo_parametro' => $this->comprobante->tipo_parametro,
                    'proceso' => $prestamo['id_tipo_credito'],
                ]),
            ]))->flatten();

            $dataCuentasContables['cta_x_cobrar_interes'][] = (new Warp([
                'capital' => $prestamo['capital'],
                'interes' => $prestamo['interes'],
                'cuenta_contable' => Parametros::getCuentaContable([
                    'clave' => 'cta_x_cobrar_interes',
                    'escenario' => $this->comprobante->escenario,
                    'tipo_parametro' => $this->comprobante->tipo_parametro,
                    'proceso' => $prestamo['id_tipo_credito'],
                ]),
            ]))->flatten();

            $dataCuentasContables['cta_rebaja_cartera_prestamos'][] = (new Warp([
                'capital' => $prestamo['capital'],
                'interes' => $prestamo['interes'],
                'cuenta_contable' => Parametros::getCuentaContable([
                    'clave' => 'cta_rebaja_cartera_prestamos',
                    'escenario' => $this->comprobante->escenario,
                    'tipo_parametro' => $this->comprobante->tipo_parametro,
                    'proceso' => $prestamo['id_tipo_credito'],
                ]),
            ]))->flatten();

            $dataCuentasContables['cta_ingresos_interes'][] = (new Warp([
                'capital' => $prestamo['capital'],
                'interes' => $prestamo['interes'],
                'cuenta_contable' => Parametros::getCuentaContable([
                    'clave' => 'cta_ingresos_interes',
                    'escenario' => $this->comprobante->escenario,
                    'tipo_parametro' => $this->comprobante->tipo_parametro,
                    'proceso' => $prestamo['id_tipo_credito'],
                ]),
            ]))->flatten();
        }

        return $dataCuentasContables;
    }
}
