<?php
namespace Incoviba\Controller;

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

class Ventas
{
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Proyecto $proyectoService): ResponseInterface
    {
        $proyectos = array_map(function(Model\Proyecto $proyecto) {return ['id' => $proyecto->id, 'descripcion' => $proyecto->descripcion];}, $proyectoService->getVendibles());
        return $view->render($response, 'ventas.list', compact('proyectos'));
    }
    public function show(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Venta $service, int $venta_id): ResponseInterface
    {
        $venta = $service->getById($venta_id);
        return $view->render($response, 'ventas.show', compact('venta'));
    }
    public function showUnidad(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Venta $service, string $proyecto_nombre, int $unidad_descripcion): ResponseInterface
    {
        $proyecto_nombre = urldecode($proyecto_nombre);
        $venta = $service->getByProyectoAndUnidad($proyecto_nombre, $unidad_descripcion);
        return $view->render($response, 'ventas.show', compact('venta'));
    }
    public function proyecto(ServerRequestInterface $request, ResponseInterface $response, Repository\Venta $service): ResponseInterface
    {
        $body = $request->getBody();
        $json = json_decode($body->getContents());
        $proyecto_id = $json->proyecto_id;
        $output = [
            'proyecto' => [
                'id' => $proyecto_id
            ],
            'total' => 0
        ];
        try {
            $ventas = $service->fetchActivaByProyecto($proyecto_id);
            $output['ventas'] = array_map(function(Model\Venta $venta) {return $venta->id;}, $ventas);
            $output['proyecto']['descripcion'] = $ventas[0]->proyecto()->descripcion;
            $output['total'] = count($ventas);
        } catch (EmptyResult) {}
        $response->getBody()->write(json_encode($output));
        return $response->withHeader('Content-Type', 'application/json');
    }
    public function get(ServerRequestInterface $request, ResponseInterface $response, Service\Venta $service, int $venta_id): ResponseInterface
    {
        try {
            $venta = $service->getById($venta_id);
            $response->getBody()->write(json_encode(compact('venta')));
        } catch (EmptyResult $exception) {
            $response->getBody()->write(json_encode(['error' => [
                'code' => $exception->getCode(),
                'message' => str_replace([PHP_EOL, "\r"], [' ', ''], $exception->getMessage())
            ]]));
        }
        return $response->withHeader('Content-Type', 'application/json');
    }
    public function edit(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Venta $service, int $venta_id): ResponseInterface
    {
        $venta = $service->getById($venta_id);
        return $view->render($response, 'ventas.edit', compact('venta'));
    }
    public function propietario(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Venta $service, Repository\Region $regionRepository, int $venta_id): ResponseInterface
    {
        $venta = $service->getById($venta_id);
        $propietario = $venta->propietario();
        $regiones = $regionRepository->fetchAll();
        usort($regiones, function(Model\Region $a, Model\Region $b) {
            return $a->numeracion - $b->numeracion;
        });
        return $view->render($response, 'ventas.propietarios.edit', compact('propietario', 'venta_id', 'regiones'));
    }
    public function propiedad(ServerRequestInterface $request, ResponseInterface $response, View $view, Service\Venta $service, Service\Venta\Unidad $unidadService, int $venta_id): ResponseInterface
    {
        $venta = $service->getById($venta_id);
        $propiedad = $venta->propiedad();
        $proyecto = $venta->proyecto();
        $unidades = $unidadService->getDisponiblesByProyecto($proyecto->id);
        $tiposUnidades = [];
        foreach ($unidades as $unidad) {
            if (!in_array($unidad->proyectoTipoUnidad->tipoUnidad, $tiposUnidades)) {
                $tiposUnidades []= $unidad->proyectoTipoUnidad->tipoUnidad;
            }
        }
        return $view->render($response, 'ventas.propiedades.edit', compact('propiedad', 'proyecto', 'tiposUnidades', 'unidades', 'venta_id'));
    }
    public function comentarios(ServerRequestInterface $request, ResponseInterface $response, Service\Venta $service, Repository\Venta\Comentario $comentarioRepository, int $venta_id): ResponseInterface
    {
        $venta = $service->getById($venta_id);
        $output = ['total' => 0];
        try {
            $comentarios = $comentarioRepository->fetchByVenta($venta->id);
            $output['total'] = count($comentarios);
            $output['comentarios'] = $comentarios;
        } catch (EmptyResult) {}
        $response->getBody()->write(json_encode($output));
        return $response->withHeader('Content-Type', 'application/json');
    }
    public function add(ServerRequestInterface $request, ResponseInterface $response, View $view, Repository\Region $regionRepository, Repository\Proyecto $proyectoRepository): ResponseInterface
    {
        $regiones = $regionRepository->fetchAll();
        usort($regiones, function(Model\Region $a, Model\Region $b) {
            return $a->numeracion - $b->numeracion;
        });
        $proyectos = $proyectoRepository->fetchAllActive();
        return $view->render($response, 'ventas.add', compact('regiones', 'proyectos'));
    }
    public function doAdd(ServerRequestInterface $request, ResponseInterface $response, Service\Venta $ventaService): ResponseInterface
    {
        $data = $request->getParsedBody();
        $output = [
            'status' => false,
            'errors' => []
        ];
        try {
            $ventaService->add($data);
            $output['status'] = true;
        } catch (\Exception $exception) {
            $output['errors'] = $exception;
        }
        $response->getBody()->write(json_encode($output));
        return $response->withHeader('Content-Type', 'application/json');
    }
    public function cuotas(ServerRequestInterface $request, ResponseInterface $response, Service\Venta $ventaService, View $view, int $venta_id): ResponseInterface
    {
        $venta = $ventaService->getById($venta_id);
        return $view->render($response, 'ventas.pies.cuotas', compact('venta'));
    }
}
