<?php
namespace Incoviba\Service;

use Incoviba\Common\Implement;
use Incoviba\Repository;
use Incoviba\Model;

class Proyecto
{
    public function __construct(
        protected Repository\Proyecto $proyectoRepository,
        protected Repository\Proyecto\EstadoProyecto $estadoProyecto
    ) {}

    /**
     * @param string|array|null $orderBy
     * @return array
     */
    public function getAll(null|string|array $orderBy = null): array
    {
        try {
            return array_map([$this, 'process'], $this->proyectoRepository->fetchAll($orderBy));
        } catch (Implement\Exception\EmptyResult) {
            return [];
        }
    }
    public function getVendibles(null|string|array $orderBy = null): array
    {
        return $this->proyectoRepository->fetchAllActive($orderBy);
    }
    public function getEscriturando(): array
    {
        return $this->proyectoRepository->fetchAllEscriturando();
    }

    /**
     * @param int $proyecto_id
     * @return Model\Proyecto
     * @throws Implement\Exception\EmptyResult
     */
    public function getById(int $proyecto_id): Model\Proyecto
    {
        return $this->process($this->proyectoRepository->fetchById($proyecto_id));
    }
    public function getByName(string $name): Model\Proyecto
    {
        return $this->process($this->proyectoRepository->fetchByName($name));
    }
    public function getByInmobiliaria(int $inmobiliaria_rut): array
    {
        return array_map([$this, 'process'], $this->proyectoRepository->fetchByInmobiliaria($inmobiliaria_rut));
    }

    protected function process(Model\Proyecto $proyecto): Model\Proyecto
    {
        $proyecto->addFactory('estados', (new Implement\Repository\Factory())
            ->setCallable([$this->estadoProyecto, 'fetchByProyecto'])
            ->setArgs([$proyecto->id]));
        $proyecto->addFactory('currentEstado', (new Implement\Repository\Factory())
            ->setCallable([$this->estadoProyecto, 'fetchCurrentByProyecto'])
            ->setArgs([$proyecto->id]));
        return $proyecto;
    }
}
