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

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

class Cierres
{
    use withJson, withRedis;
    public function proyecto(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService,
                             Service\Venta\Cierre $service): ResponseInterface
    {
        $body = $request->getBody();
        $json = json_decode($body->getContents());
        $proyecto_id = $json->proyecto_id;
        $output = ['total' => 0, 'cierres' => []];
        $redisKey = "cierres:proyecto:{$proyecto_id}";
        try {
            $output['cierres'] = $this->fetchRedis($redisService, $redisKey);
            $output['total'] = count($output['cierres']);
        } catch (EmptyRedis) {
            try {
                $cierres = $service->getByProyecto($proyecto_id);
                $output['cierres'] = $cierres;
                $this->saveRedis($redisService, $redisKey, $output['cierres']);
                $output['total'] = count($cierres);
            } catch (EmptyResult) {}
        }
        return $this->withJson($response, $output);
    }
    public function vigentes(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService,
                             Repository\Venta\Cierre $cierreRepository): ResponseInterface
    {
        $output = ['cierres' => []];
        $redisKey = "cierres:vigentes";
        try {
            $output['cierres'] = $this->fetchRedis($redisService, $redisKey);
        } catch (EmptyRedis) {
            try {
                $cierres = $cierreRepository->fetchDatosVigentes();
                $estados = [
                    'revisado' => 'pendientes',
                    'rechazado' => 'rechazados',
                    'aprobado' => 'pendientes',
                    'vendido' => 'promesados',
                    'abandonado' => 'rechazados',
                    'promesado' => 'promesados',
                    'resciliado' => 'rechazados'
                ];
                foreach ($cierres as $row) {
                    if (!isset($output['cierres'][$row['Proyecto']])) {
                        $output['cierres'][$row['Proyecto']] = [
                            'promesados' => 0,
                            'pendientes' => 0,
                            'rechazados' => 0,
                            'total' => 0
                        ];
                    }
                    $estado = $estados[$row['Estado']];
                    $output['cierres'][$row['Proyecto']][$estado] += $row['Cantidad'];
                    $output['cierres'][$row['Proyecto']]['total'] += $row['Cantidad'];
                }
                $this->saveRedis($redisService, $redisKey, $output['cierres']);
            } catch (EmptyRedis) {}
        }
        return $this->withJson($response, $output);
    }
}
