<?php
namespace Incoviba\Model\Venta;

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

class Factura extends Ideal\Model
{
    public Model\Venta $venta;

    public int $index;
    public float $proporcion;
    public Model\Persona $cliente;

    public ?DateTimeInterface $fecha = null;
    public ?array $unidades = null; // [[unidad, descripcion, precio, prorrateo]]
    public ?int $terreno = null;
    public ?object $uf = null; // [fecha, valor]
    public ?object $ipc = null; // [fecha, valor]

    protected array $estados;
    public function estados(): array
    {
        if (!isset($this->estados)) {
            $this->estados = $this->runFactory('estados');
        }
        return $this->estados ?? [];
    }

    public function total(): float
    {
        return $this->venta->valor * $this->uf->valor * $this->proporcion;
    }
    public function bruto(): float
    {
        return $this->total() - $this->terreno * $this->proporcion;
    }
    public function iva(): float
    {
        return $this->neto() * .19;
    }
    public function neto(): float
    {
        return $this->bruto() / 1.19;
    }
    public function base(): float
    {
        return $this->neto() + $this->terreno * $this->proporcion;
    }
    public function detalle(): array
    {
        return [
            'base' => $this->base(),
            'terreno' => $this->terreno * $this->proporcion,
            'neto' => $this->neto(),
            'iva' => $this->iva(),
            'bruto' => $this->bruto(),
            'total' => $this->total(),
            'descuento' => array_reduce($this->unidades, function($sum, $unidad) {
                return $sum + $unidad->prorrateo * $this->proporcion;
            }, 0)
        ];
    }
    public function totales(): array
    {
        return [
            'neto' => array_reduce($this->unidades, function($sum, $unidad) {
                return $sum + $unidad->precio * $this->proporcion;
            }),
            'exento' => $this->terreno * $this->proporcion,
            'iva' => $this->iva(),
            'total' => $this->total()
        ];
    }

    public function jsonSerialize(): mixed
    {
        return array_merge(parent::jsonSerialize(), [
            'venta_id' => $this->venta->id,
            'index' => $this->index,
            'proporcion' => $this->proporcion,
            'emisor' => [
                'rut' => $this->venta->proyecto()->inmobiliaria()->rut(),
                'nombre' => $this->venta->proyecto()->inmobiliaria()->nombreCompleto(),
                'direccion' => $this->venta->proyecto()->direccion()->simple(),
                'comuna' => $this->venta->proyecto()->direccion()->comuna->descripcion
            ],
            'receptor' => [
                'rut' => $this->cliente->rutCompleto(),
                'nombre' => $this->cliente->nombreCompleto(),
                'direccion' => $this->cliente->datos()->direccion?->simple(),
                'comuna' => $this->cliente->datos()->direccion?->comuna->descripcion
            ],
            'fecha' => $this->fecha?->format('Y-m-d'),
            'unidades' => $this->unidades,
            'detalle' => $this->detalle(),
            'total' => $this->totales(),
            'uf' => [
                'fecha' => $this->uf?->fecha->format('Y-m-d'),
                'valor' => $this->uf?->valor
            ],
        ]);
    }

}
