<?php
namespace Incoviba\Model;

use DateTimeInterface;
use Incoviba\Common\Ideal;
use Incoviba\Controller\Ventas;

class Venta extends Ideal\Model
{
    protected Venta\Propietario $propietario;
    protected Venta\Propiedad $propiedad;
    protected Venta\FormaPago $formaPago;
    public DateTimeInterface $fecha;
    public DateTimeInterface $fechaIngreso;
    public float $valor;
    public bool $relacionado;
    protected ?Venta\Entrega $entrega;
    public float $uf;

    public array $estados;
    public Venta\EstadoVenta $currentEstado;

    public function propietario(): Venta\Propietario
    {
        if (!isset($this->propietario)) {
            $this->propietario = $this->runFactory('propietario');
        }
        return $this->propietario;
    }
    public function propiedad(): Venta\Propiedad
    {
        if (!isset($this->propiedad)) {
            $this->propiedad = $this->runFactory('propiedad');
        }
        return $this->propiedad;
    }
    public function formaPago(): Venta\FormaPago
    {
        if (!isset($this->formaPago)) {
            $this->formaPago = $this->runFactory('formaPago');
        }
        return $this->formaPago;
    }
    public function entrega(): ?Venta\Entrega
    {
        if (!isset($this->entrega)) {
            $this->entrega = $this->runFactory('entrega');
        }
        return $this->entrega;
    }

    public function estados(): array
    {
        if (!isset($this->estados)) {
            $this->estados = $this->runFactory('estados');
        }
        return $this->estados;
    }
    public function currentEstado(): ?Venta\EstadoVenta
    {
        if (!isset($this->currentEstado)) {
            $this->currentEstado = $this->runFactory('currentEstado');
        }
        return $this->currentEstado;
    }

    public function proyecto(): Proyecto
    {
        return $this->propiedad()->departamentos()[0]->proyectoTipoUnidad->proyecto;
    }

    protected float $valor_util;
    public function util(): float
    {
        if (!isset($this->valor_util)) {
            $sum = $this->valor;
            $sum -= array_reduce($this->propiedad()->estacionamientos(), function(float $sum, Venta\Unidad $unidad) {
                return $unidad->precio($this->fecha)->valor;
            }, 0);
            $sum -= array_reduce($this->propiedad()->bodegas(), function(float $sum, Venta\Unidad $unidad) {
                return $unidad->precio($this->fecha)->valor;
            }, 0);
            $this->valor_util = $sum;
        }
        return $this->valor_util;
    }
    public function saldo(): float
    {
        return $this->valor - $this->formaPago->total();
    }

    public function jsonSerialize(): mixed
    {
        return array_merge(parent::jsonSerialize(), [
            'propietario' => $this->propietario(),
            'propiedad' => $this->propiedad(),
            'forma_pago' => $this->formaPago()->ids(),
            'fecha' => $this->fecha->format('Y-m-d'),
            'fecha_ingreso' => $this->fechaIngreso->format('Y-m-d'),
            'valor' => $this->valor,
            'relacionado' => $this->relacionado,
            'proyecto' => $this->proyecto(),
            'estados' => array_map(function(Venta\EstadoVenta $estado) {return $estado->id;}, $this->estados()),
            'current_estado' => $this->currentEstado()
        ]);
    }
}
