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

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

class Escrituras
{
    use withJson;

    public function add(ServerRequestInterface $request, ResponseInterface $response,
                        Repository\Venta $ventaRepository, Service\Venta $ventaService,
                        Repository\Venta\Escritura $escrituraRepository, Service\Venta\Pago $pagoService,
                        Service\UF $ufService, int $venta_id): ResponseInterface
    {
        $body = $request->getParsedBody();
        $output = [
            'venta_id' => $venta_id,
            'input' => $body,
            'status' => false
        ];
        try {
            $venta = $ventaService->getById($venta_id);
            if (isset($venta->formaPago()->escritura)) {
                throw new EmptyResult('');
            }
            $fecha = new DateTimeImmutable($body['fecha']);
            $uf = $ufService->get($fecha);
            $valor = $body['valor'];
            if (str_contains($valor, ',')) {
                $valor = str_replace(['.', ','], ['', '.'], $valor);
            }
            $valor = ((float) $valor) * (($body['uf']) ? $uf : 1);
            $data = [
                'fecha' => $fecha->format('Y-m-d'),
                'valor' => $valor,
                'banco' => $body['banco'],
                'tipo' => $body['tipo'],
                'uf' => $uf
            ];
            $pago = $pagoService->add($data);
            $data = [
                'valor' => $valor,
                'fecha' => $fecha->format('Y-m-d'),
                'uf' => $uf,
                'pago' => $pago->id
            ];
            $escritura = $escrituraRepository->create($data);
            $escrituraRepository->save($escritura);
            $ventaRepository->edit($venta, ['escritura' => $escritura->id]);
            $output['status'] = true;
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
    public function edit(ServerRequestInterface $request, ResponseInterface $response,
                         Service\Venta          $ventaService, Repository\Venta\EstadoVenta $estadoVentaRepository,
                         int                    $venta_id): ResponseInterface
    {
        $body = $request->getParsedBody();
        $output = [
            'venta_id' => $venta_id,
            'input' => $body,
            'edited' => false
        ];
        try {
            $venta = $ventaService->getById($venta_id);
            $estado = $venta->currentEstado();
            if (!in_array($estado->tipoEstadoVenta->descripcion, ['escriturando', 'firmado por inmobiliaria'])) {
                throw new EmptyResult('');
            }
            $body['fecha'] = (new DateTimeImmutable($body['fecha']))->format('Y-m-d');
            $estadoVentaRepository->edit($estado, $body);
            $output['edited'] = true;
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
}
