<?php
namespace Incoviba\Model\Venta;

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

class Pago extends Model
{
    const UF = 'uf';
    const PESOS = 'pesos';

    public float $valor;
    public ?Banco $banco;
    public ?TipoPago $tipoPago;
    public ?string $identificador;
    public ?DateTimeInterface $fecha;
    public ?float $uf;
    public ?string $pagador;
    public ?Pago $asociado;

    public array $estados;
    public EstadoPago $currentEstado;

    public function valor(string $moneda = Pago::UF): float
    {
        $multiplier = 1;
        if ($moneda === Pago::UF) {
            if ($this->uf === null or $this->uf === 0.0) {
                return 0;
            }
            $uf = $this->uf;
            $multiplier = 1 / $uf;
        }
        return $this->valor * $multiplier;
    }

    public function estado(?string $tipoEstado = null): ?EstadoPago
    {
        if (!isset($this->estados)) {
            return null;
        }
        if ($tipoEstado === null) {
            return $this->currentEstado;
        }
        foreach ($this->estados as $estado) {
            if ($estado->tipoEstado->descripcion === $tipoEstado) {
                return $estado;
            }
        }
        return null;
    }

    public function jsonSerialize(): mixed
    {
        return array_merge(parent::jsonSerialize(), [
            'valor' => $this->valor,
            'valor_uf' => $this->valor(),
            'banco' => $this->banco ?? '',
            'tipo_pago' => $this->tipoPago ?? '',
            'identificador' => $this->identificador ?? '',
            'fecha' => $this->fecha->format('Y-m-d H:i:s') ?? '',
            'uf' => $this->uf ?? 1,
            'pagador' => $this->pagador ?? '',
            'asociado' => $this->asociado ?? ''
        ]);
    }
}
