<?php
namespace Incoviba\Service\Contabilidad\Movimiento;

use Psr\Log\LoggerInterface;
use Incoviba\Common\Ideal;
use Incoviba\Common\Implement;
use Incoviba\Model;
use Incoviba\Repository;
use Incoviba\Service;

class Auxiliar extends Ideal\Service
{
    public function __construct(LoggerInterface $logger,
                                protected Repository\Contabilidad\Movimiento\Auxiliar $auxiliarRepository,
                                protected Repository\Contabilidad\Movimiento\Auxiliar\Detalle $detalleRepository)
    {
        parent::__construct($logger);
    }

    public function getByMovimiento(int $movimiento_id): ?array
    {
        try {
            return array_map([$this, 'process'], $this->auxiliarRepository->fetchByMovimiento($movimiento_id));
        } catch (Implement\Exception\EmptyResult) {
            return null;
        }
    }

    protected function process(Model\Contabilidad\Movimiento\Auxiliar $auxiliar): Model\Contabilidad\Movimiento\Auxiliar
    {
        $auxiliar->addFactory('detalles', (new Implement\Repository\Factory())
            ->setCallable(function(int $auxiliar_id) {
                try {
                    return $this->detalleRepository->fetchByAuxiliar($auxiliar_id);
                } catch (Implement\Exception\EmptyResult) {
                    return null;
                }
            })
            ->setArgs(['auxiliar_id' => $auxiliar->id]));
        return $auxiliar;
    }
}
