<?php
namespace Incoviba\Controller;

use DateInterval;
use DateTimeImmutable;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Incoviba\Common\Alias\View;
use Incoviba\Common\Ideal\Controller;
use Incoviba\Common\Implement\Exception\{EmptyRedis, EmptyResult};
use Incoviba\Model;
use Incoviba\Repository;
use Incoviba\Service;

class Contabilidad extends Controller
{
    use withRedis;

    public function diaria(ServerRequestInterface              $request, ResponseInterface $response, View $view,
                           Service\Redis                       $redisService,
                           Repository\Inmobiliaria             $inmobiliariaRepository,
                           Repository\Contabilidad\CentroCosto $centroCostoRepository): ResponseInterface
    {
        $redisKey = 'inmobiliarias';
        $inmobiliarias = [];
        try {
            $inmobiliarias = $this->fetchRedis($redisService, $redisKey);
        } catch (EmptyRedis) {
            try {
                $inmobiliarias = $inmobiliariaRepository->fetchAll('razon');
                $this->saveRedis($redisService, $redisKey, $inmobiliarias, 30 * 24 * 60 * 60);
            } catch (EmptyResult) {}
        }
        $centrosCostos = $centroCostoRepository->fetchAll();
        return $view->render($response, 'contabilidad.cartolas.diaria', compact('inmobiliarias', 'centrosCostos'));
    }
    public function importar(ServerRequestInterface $request, ResponseInterface $response, View $view,
                              Repository\Inmobiliaria       $inmobiliariaRepository,
                              Repository\Contabilidad\Banco $bancoRepository): ResponseInterface
    {
        $inmobiliarias = [];
        try {
            $inmobiliarias = $inmobiliariaRepository->fetchAll('razon');
        } catch (EmptyResult) {}
        $bancos = [];
        try {
            $bancos = $bancoRepository->fetchAll('nombre');
        } catch (EmptyResult) {}
        return $view->render($response, 'contabilidad.cartolas.import', compact('inmobiliarias', 'bancos'));
    }
    public function depositos(ServerRequestInterface           $request, ResponseInterface $response, View $view,
                              Service\Redis                    $redisService,
                              Repository\Inmobiliaria          $inmobiliariaRepository,
                              Repository\Contabilidad\Deposito $dapRepository): ResponseInterface
    {
        $redisKey = 'inmobiliarias';
        $inmobiliarias = [];
        try {
            $inmobiliarias = $this->fetchRedis($redisService, $redisKey);
        } catch (EmptyRedis) {
            try {
                $inmobiliarias = $inmobiliariaRepository->fetchAll();
                $this->saveRedis($redisService, $redisKey, $inmobiliarias, 30 * 24 * 60 * 60);
            } catch (EmptyResult) {}
        }
        $depositos = [];
        try {
            $depositos = $dapRepository->fetchAll();
        } catch (EmptyResult) {}
        $fecha = new DateTimeImmutable('today');
        $activos = array_filter($depositos, function(Model\Contabilidad\Deposito $deposito) use ($fecha) {
            return $deposito->termino >= $fecha;
        });
        $mes = $fecha->sub(new DateInterval('P1M'));
        $vencidos = array_filter($depositos, function(Model\Contabilidad\Deposito $deposito) use ($fecha, $mes) {
            return $deposito->termino < $fecha and $deposito->termino >= $mes;
        });
        return $view->render($response, 'contabilidad.depositos', compact('inmobiliarias', 'activos', 'vencidos'));
    }
    public function tesoreria(ServerRequestInterface $request, ResponseInterface $response, View $view,
                              Service\Contabilidad\Informe\Tesoreria $contabilidadService,
                              string $fecha = 'today'): ResponseInterface
    {
        $fecha = new DateTimeImmutable($fecha);
        $anterior = $contabilidadService->getOutput()->getAnterior($fecha);
        $yesterday = new DateTimeImmutable('yesterday');
        $siguiente = null;
        if ($yesterday > $fecha) {
            $siguiente = $fecha->add(new DateInterval('P1D'));
            if ($siguiente->format('N') === '6') {
                $siguiente = $fecha->add(new DateInterval('P3D'));
            }
        }
        $informes = $contabilidadService->getOutput()->build($fecha);
        $filename = "Informe de Tesorería {$fecha->format('d.m.Y')}";
        return $view->render($response, 'contabilidad.informes.tesoreria', compact('fecha', 'anterior', 'siguiente', 'informes', 'filename'));
    }
    /*public function semanal(ServerRequestInterface $request, ResponseInterface $response, View $view,
                            Service\Contabilidad\Informe\Semanal $semanalService,
                            string $fecha = 'today'): ResponseInterface
    {

    }*/
    public function cuadratura(ServerRequestInterface $request, ResponseInterface $response, View $view,
                               Repository\Inmobiliaria $inmobiliariaRepository): ResponseInterface
    {
        $inmobiliarias = [];
        try {
            $inmobiliarias = $inmobiliariaRepository->fetchAll('razon');
        } catch (EmptyResult) {}
        return $view->render($response, 'contabilidad.cuadratura', compact('inmobiliarias'));
    }
}
