<?php
namespace Incoviba\Controller\API\Ventas;

use DateTimeImmutable;
use Incoviba\Common\Implement\Exception\EmptyRedis;
use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Controller\API\withJson;
use Incoviba\Controller\withRedis;
use Incoviba\Model;
use Incoviba\Repository;
use Incoviba\Service;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

class Unidades
{
    use withJson, withRedis;

    public function get(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService,
                        Service\Venta\Unidad $unidadService, int $unidad_id): ResponseInterface
    {
        $output = [
            'unidad_id' => $unidad_id,
            'unidad' => null
        ];
        $redisKey = "unidad:{$unidad_id}";
        try {
            $output['unidad'] = $this->fetchRedis($redisService, $redisKey);
        } catch (EmptyRedis) {
            try {
                $output['unidad'] = $unidadService->getById($unidad_id);
                $this->saveRedis($redisService, $redisKey, $output['unidad']);
            } catch (EmptyResult) {}
        }
        return $this->withJson($response, $output);
    }
    public function disponibles(ServerRequestInterface $request, ResponseInterface $response,
                                Repository\Venta\Unidad $unidadRepository,
                                Repository\Proyecto\TipoUnidad $tipoUnidadRepository,
                                Service\Redis $redisService): ResponseInterface
    {
        $body = $request->getBody();
        $json = json_decode($body->getContents());
        $proyecto_id = $json->proyecto_id;
        $today = new DateTimeImmutable();
        $redisKey = "unidades:disponibles:proyecto:{$proyecto_id}:{$today->format('Y-m-d')}";

        $output = [
            'proyecto_id' => $proyecto_id,
            'unidades' => [
                'total' => [
                    'departamentos' => 0,
                    'estacionamientos' => 0,
                    'bodegas' => 0,
                ],
                'departamentos' => 0,
                'estacionamientos' => 0,
                'bodegas' => 0,
            ]
        ];
        try {
            $output = $this->fetchRedis($redisService, $redisKey);
        } catch (EmptyRedis) {
            try {
                $totalUnidades = $unidadRepository->fetchByProyecto($proyecto_id);
                $unidades = $unidadRepository->fetchDisponiblesByProyecto($proyecto_id);

                $tiposUnidades = $tipoUnidadRepository->fetchAll();
                foreach ($tiposUnidades as $tipoUnidad) {
                    $tempUnidades = array_filter($totalUnidades, function(Model\Venta\Unidad $unidad) use ($tipoUnidad) {
                        return $unidad->proyectoTipoUnidad->tipoUnidad->id === $tipoUnidad->id;
                    });
                    if (count($tempUnidades) > 0) {
                        $output['unidades']['total']["{$tipoUnidad->descripcion}s"] = count($tempUnidades);
                    }
                    $tempUnidades = array_filter($unidades, function(Model\Venta\Unidad $unidad) use ($tipoUnidad) {
                        return $unidad->proyectoTipoUnidad->tipoUnidad->id === $tipoUnidad->id;
                    });
                    if (count($tempUnidades) === 0) {
                        continue;
                    }
                    $output['unidades']["{$tipoUnidad->descripcion}s"] = count($tempUnidades);
                }
                $this->saveRedis($redisService, $redisKey, $output);
            } catch (EmptyResult) {}
        }
        return $this->withJson($response, $output);
    }
    public function prorrateo(ServerRequestInterface $request, ResponseInterface $response,
                              Repository\Venta\Unidad $unidadRepository,
                              Service\Venta\Unidad $unidadService,
                              int $unidad_id): ResponseInterface
    {
        $body = $request->getParsedBody();
        $output = [
            'unidad_id' => $unidad_id,
            'input' => $body,
            'edited' => false
        ];
        try {
            $unidadService->editProrrateo($unidad_id, $body);
            $output['edited'] = true;
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
}
