<?php
namespace Incoviba\Controller\API;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Model;
use Incoviba\Repository;
use Incoviba\Service;

class Inmobiliarias
{
    use withJson;

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, Repository\Inmobiliaria $inmobiliariaRepository): ResponseInterface
    {
        $output = [
            'inmobiliarias' => []
        ];
        try {
            $output['inmobiliarias'] = $inmobiliariaRepository->fetchAll('razon');
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
    public function cuentas(ServerRequestInterface $request, ResponseInterface $response,
                            Repository\Inmobiliaria $inmobiliariaRepository,
                            Repository\Inmobiliaria\Cuenta $cuentaRepository, int $inmobiliaria_rut): ResponseInterface
    {
        $output = [
            'inmobiliaria_rut' => $inmobiliaria_rut,
            'cuentas' => []
        ];
        try {
            $inmobiliaria = $inmobiliariaRepository->fetchById($inmobiliaria_rut);
            $output['cuentas'] = $cuentaRepository->fetchByInmobiliaria($inmobiliaria->rut);
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
    public function proyectos(ServerRequestInterface  $request, ResponseInterface $response,
                              Repository\Inmobiliaria $inmobiliariaRepository,
                              Service\Proyecto        $proyectoService, int $inmobiliaria_rut): ResponseInterface
    {
        $output = [
            'inmobiliaria_rut' => $inmobiliaria_rut,
            'proyectos' => []
        ];
        try {
            $inmobiliaria = $inmobiliariaRepository->fetchById($inmobiliaria_rut);
            $output['proyectos'] = array_map(function(Model\Proyecto $proyecto) {
                $p = json_decode(json_encode($proyecto));
                $p->current_estado = $proyecto->currentEstado();
                $p->estados = $proyecto->estados();
                return $p;
            },$proyectoService->getByInmobiliaria($inmobiliaria->rut));
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
    public function proveedores(ServerRequestInterface                 $request, ResponseInterface $response,
                                Repository\Inmobiliaria                $inmobiliariaRepository,
                                Repository\Inmobiliaria\SociedadAgente $sociedadAgenteRepository,
                                Repository\Inmobiliaria\TipoAgente     $tipoAgenteRepository,
                                int                                    $inmobiliaria_rut): ResponseInterface
    {
        $input = $request->getParsedBody();
        $output = [
            'sociedad_rut' => $inmobiliaria_rut,
            'input' => $input,
            'sociedad' => null,
            'proveedores' => []
        ];
        try {
            $inmobiliaria = $inmobiliariaRepository->fetchById($inmobiliaria_rut);
            $output['sociedad'] = $inmobiliaria;
            if (isset($input['tipo_agente_id'])) {
                $tipo = $tipoAgenteRepository->fetchById($input['tipo_agente_id']);
                $proveedores = $sociedadAgenteRepository->fetchBySociedadAndTipo($inmobiliaria->rut, $tipo->id);
            } else {
                $proveedores = $sociedadAgenteRepository->fetchBySociedad($inmobiliaria->rut);
            }
            $output['proveedores'] = json_decode(json_encode($proveedores), JSON_OBJECT_AS_ARRAY);
            foreach ($proveedores as $i => $proveedor) {
                $output['proveedores'][$i]['sociedad'] = $proveedor->sociedad;
                $output['proveedores'][$i]['proveedor'] = $proveedor->agenteTipo->agente;
                $output['proveedores'][$i]['tipo'] = $proveedor->agenteTipo->tipoAgente;
            }
        } catch (EmptyResult) {}
        return $this->withJson($response, $output);
    }
}
