<?php
namespace Incoviba\old\Venta;

use Incoviba\Common\Alias\OldModel as Model;
use Incoviba\old\Common\Banco;
use Carbon\Carbon;

/**
 *
 * @author Aldarien
 *
 * @property int id
 * @property double valor
 * @property Banco banco
 * @property TipoPago tipo
 * @property string identificador
 * @property date fecha
 * @property float uf
 * @property string pagador
 *
 */
class Pago extends Model
{
	public function banco()
	{
		$banco = $this->belongs_to(Banco::class, 'banco');
		if ($banco) {
			return $banco->findOne();
		}
		return null;
	}
	public function tipo()
	{
		return $this->belongs_to(TipoPago::class, 'tipo')->findOne();
	}
	public function estados($order = 'fecha', $direction = 'desc')
	{
		$estados = $this->has_many(EstadoPago::class, 'pago');
		if ($direction == 'desc') {
			$estados->orderByDesc($order);
			if ($order != 'id') {
				$estados->orderByDesc('id');
			}
		} else {
			$estados->orderByAsc($order);
			if ($order != 'id') {
				$estados->orderByAsc('id');
			}
		}
		return $estados->findMany();
	}
	public function estado()
	{
		$estado = $this->has_many(EstadoPago::class, 'pago')->order_by_desc('id')->findOne();
		return $estado;
	}
	public function fecha()
	{
		return Carbon::parse($this->fecha, config('app.timezone'));
	}
	public function uf()
	{
		if ($this->uf == 0) {
			$uf = uf($this->fecha);
			if (!$uf or $uf->total == 0) {
				return 1;
			}
			if ($uf->total > 0) {
				$this->uf = $uf->uf->value;
				$this->save();
			}
		}
		return $this->uf;
	}
	public function valor($tipo = 'pesos')
	{
		$valor = $this->valor;
		if ($tipo == 'ufs') {
			$uf = $this->uf();
			if ($uf == 1 and method_exists($this->fuente()[0]->obj, 'uf')) {
				$uf = $this->fuente()[0]->obj->uf();
			}
			if ($uf == 0) {
				$uf = 1;
			}
			$valor /= $uf;
			if ($this->asociado() and $this->asociado == 0) {
				$valor += $this->asociado()->valor('ufs');
			}
			return $valor;
		}
		if ($this->asociado() and $this->asociado == 0) {
			$valor += $this->asociado()->valor();
		}
		return $valor;
	}
	public function new()
	{
		$this->save();

		$estado = \Model::factory(EstadoPago::class)->create();
		$estado->pago = $this->id;
		$estado->fecha = $this->fecha;
		$estado->estado = 0;
		$estado->save();
	}
	public function newPagado()
	{
		$this->new();

		$estado = \Model::factory(EstadoPago::class)->create();
		$estado->pago = $this->id;
		$estado->fecha = $this->fecha;
		$estado->estado = 1;
		$estado->save();
	}
	public function fuente()
	{
		$results = [];
		$cuota = model(Cuota::class)->where('pago', $this->id)->findOne();
		if ($cuota) {
			$results []= (object) ['tipo' => 'cuota', 'obj' => $cuota];
		}
		$credito = model(Credito::class)->where('pago', $this->id)->findOne();
		if ($credito) {
			$results []= (object) ['tipo' => 'credito', 'obj' => $credito];
		}
		$escritura = model(Escritura::class)->where('pago', $this->id)->findOne();
		if ($escritura) {
			$results []= (object) ['tipo' => 'escritura', 'obj' => $escritura];
		}
		$subsidio = model(Subsidio::class)->where('pago', $this->id)->findOne();
		if ($subsidio) {
			$results []= (object) ['tipo' => 'subsidio', 'obj' => $subsidio];
		}
		$bono = model(BonoPie::class)->where('pago', $this->id)->findOne();
		if ($bono) {
			$results []= (object) ['tipo' => 'bono_pie', 'obj' => $bono];
		}
		return $results;
	}
	public function asociado()
	{
		if ($this->asociado == 0) {
			return $this->hasOne(Pago::class, 'asociado')->findOne();
		}
		return $this->belongsTo(Pago::class, 'asociado')->findOne();
	}

	public static function filterEstado(\ORM $orm)
	{
		return $orm->rawJoin(
							'JOIN (SELECT ep.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago ep ON ep.id = e0.id)',
							['estado_pago.pago', '=', 'pago.id'],
							'estado_pago'
					);
	}
}
?>
