<?php
namespace Incoviba\Model\Venta;

use DateTimeInterface;
use Incoviba\Common\Ideal;
use Incoviba\Model;

class Unidad extends Ideal\Model
{
    public ?string $subtipo = '';
    public int $piso;
    public string $descripcion;
    public ?string $orientacion = '';
    public Model\Proyecto\ProyectoTipoUnidad $proyectoTipoUnidad;

    public array $precios = [];
    public ?Precio $currentPrecio = null;

    public function precio(DateTimeInterface $dateTime): Precio
    {
        if ($dateTime > $this->currentPrecio->current->fecha) {
            return $this->currentPrecio;
        }
        $precio = array_reduce(array_filter($this->precios, function(Precio $precio) use ($dateTime) {
            return $dateTime > $precio->current->fecha;
        }), function(?Precio $max, Precio $precio) {
            if ($max === null) {
                return $precio;
            }
            return $max->current->fecha > $precio->current->fecha ? $max : $precio;
        });
        if ($precio === null) {
            $precio = array_reduce(array_filter($this->precios, function(Precio $precio) use ($dateTime) {
                return $dateTime < $precio->current->fecha;
            }), function(?Precio $min, Precio $precio) {
                if ($min === null) {
                    return $precio;
                }
                return $min->current->fecha < $precio->current->fecha ? $min : $precio;
            });
        }

        return $precio;
    }

    public function jsonSerialize(): mixed
    {
        return array_merge(parent::jsonSerialize(), [
            'subtipo' => $this->subtipo,
            'piso' => $this->piso,
            'descripcion' => $this->descripcion,
            'orientacion' => $this->orientacion,
            'proyecto_tipo_unidad' => $this->proyectoTipoUnidad
        ]);
    }
}
