<?php
namespace Incoviba\Controller;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Incoviba\Common\Alias\View;
use Incoviba\Common\Implement\Exception\EmptyRedis;
use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Model;
use Incoviba\Repository;
use Incoviba\Service;

class Proyectos
{
    use withRedis;

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, View $view,
                             Repository\Proyecto $proyectoRepository): ResponseInterface
    {
        $proyectos = [];
        try {
            $proyectos = $proyectoRepository->fetchAll();
            usort($proyectos, function(Model\Proyecto $a, Model\Proyecto $b) {
                return strcmp($a->descripcion, $b->descripcion);
            });
        } catch (EmptyResult) {}
        return $view->render($response, 'proyectos.list', compact('proyectos'));
    }
    public function unidades(ServerRequestInterface $request, ResponseInterface $response, View $view,
                             Service\Redis $redisService, Repository\Proyecto $proyectoRepository,
                             Repository\Venta\Unidad $unidadRepository): ResponseInterface
    {
        $proyectos = [];
        $redisKey = "proyectos:con_unidades";
        try {
            $proyectos = $this->fetchRedis($redisService, $redisKey);
        } catch (EmptyRedis) {
            try {
                $proyectos = $proyectoRepository->fetchAll();
                $proyectos = array_filter($proyectos, function(Model\Proyecto $proyecto) use ($unidadRepository) {
                    $unidades = $unidadRepository->fetchByProyecto($proyecto->id);
                    return count($unidades) > 0;
                });
                usort($proyectos, function(Model\Proyecto $a, Model\Proyecto $b) {
                    return strcmp($a->descripcion, $b->descripcion);
                });
                $this->saveRedis($redisService, $redisKey, $proyectos);
            } catch (EmptyResult) {}
        }
        return $view->render($response, 'proyectos.unidades', compact('proyectos'));
    }
    public function show(ServerRequestInterface $request, ResponseInterface $response, View $view,
                         Service\Redis $redisService, Service\Proyecto $proyectoService,
                         Repository\Proyecto $proyectoRepository, int $proyecto_id): ResponseInterface
    {
        $redisKey = "proyecto:{$proyecto_id}";
        try {
            $proyecto = $proyectoService->getById($this->fetchRedis($redisService, $redisKey)->id);
        } catch (EmptyRedis) {
            $proyecto = $proyectoService->getById($proyecto_id);
            $this->saveRedis($redisService, $redisKey, $proyecto);
        }
        return $view->render($response, 'proyectos.show', compact('proyecto'));
    }
}
