<?php
namespace Incoviba\Model\Venta;

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

class Cierre extends Ideal\Model
{
    public Model\Proyecto $proyecto;
    public float $precio;
    public DateTimeInterface $dateTime;
    public bool $relacionado;
    public Propietario $propietario;

    public array $estados = [];
    public ?EstadoCierre $current = null;

    public array $unidades = [];
    public array $valoresCierre = [];

    public function neto(): float
    {
        $sum = $this->precio;
        $bonos = array_filter($this->valoresCierre, function(ValorCierre $valorCierre) {return $valorCierre->tipoValorCierre->descripcion === 'bono pie';});
        $sum -= array_reduce($bonos, function($sum, ValorCierre $bono) {return $sum + $bono->valor;}, 0);
        $unidades = array_filter($this->unidades, function(Unidad $unidad) {return $unidad->proyectoTipoUnidad->tipoUnidad->descripcion !== 'departamento';});
        $sum -= array_reduce($unidades, function($sum, Unidad $unidad) {return $sum + ($unidad->currentPrecio->valor ?? 0);});
        return $sum;
    }

    public function principal(): stdClass
    {
        $unidades = array_filter($this->unidades, function(Unidad $unidad) {return $unidad->proyectoTipoUnidad->tipoUnidad->descripcion === 'departamento';});
        $output = [
            'descripcion' => implode(' - ', array_map(function(Unidad $unidad) {return $unidad->descripcion;}, $unidades)),
            'vendible' => array_reduce($unidades, function($sum, Unidad $unidad) {return $sum + $unidad->proyectoTipoUnidad->vendible();}, 0),
            'precio' => array_reduce($unidades, function($sum, Unidad $unidad) {return $sum + $unidad->currentPrecio->valor;}, 0)
        ];
        return (object) $output;
    }

    public function jsonSerialize(): mixed
    {
        return array_merge(parent::jsonSerialize(), [
            'proyecto' => $this->proyecto,
            'precio' => $this->precio,
            'date_time' => $this->dateTime->format('Y-m-d H:i:s'),
            'relacionado' => $this->relacionado,
            'propietario' => $this->propietario->rut,
            'estados' => $this->estados,
            'estado_cierre' => $this->current,
            'unidades' => $this->unidades,
            'valores_cierre' => $this->valoresCierre
        ]);
    }
}
