<?php
namespace Incoviba\old\Venta;

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

/**
 *
 * @property int id
 * @property date fecha
 * @property float valor
 * @property float uf
 * @property int cuotas
 * @property int asociado
 * @property int reajuste
 *
 */
class Pie extends Model
{
	public function cuotas($order = 'numero', $fecha = null)
	{
		if ($this->asociado != 0) {
			return $this->asociado()->cuotas();
		}
		$cuotas = $this->hasMany(Cuota::class, 'pie')
			->select('cuota.*')
			->join('pago', ['pago.id', '=', 'cuota.pago'])
			->rawJoin('JOIN (SELECT e1.* FROM (SELECT pago, MAX(id) AS id FROM estado_pago GROUP BY pago) e0 JOIN estado_pago e1 ON e1.id = e0.id)', ['ep.pago', '=', 'pago.id'], 'ep')
			->join('tipo_estado_pago', ['tipo_estado_pago.id', '=', 'ep.estado'])
			->whereNotEqual('tipo_estado_pago.descripcion', 'reemplazado')
			->whereNotEqual('tipo_estado_pago.descripcion', 'anulado');
		if ($fecha != null) {
			$cuota = $cuotas->whereLte('ep.fecha', $fecha->format('Y-m-d'));
		}
		switch ($order) {
			case 'numero':
			case 'number':
			default:
				$cuotas = $cuotas->orderByAsc('cuota.numero');
			case 'fecha':
			case 'date':
				$cuotas = $cuotas->orderByAsc('pago.fecha')
					->orderByDesc('pago.valor');
				break;
		}
		$cuotas = $cuotas->findMany();
		return $cuotas;
	}
	public function pagadas($fecha = null)
	{
		$estado = model(TipoEstadoPago::class)->where('descripcion', 'depositado')->findOne();
		$cuotas = $this->cuotas('numero', $fecha);
		foreach ($cuotas as $i => &$cuota) {
			if ($cuota->pago()->estado()->estado < $estado->id) {
				unset($cuotas[$i]);
			}
		}
		array_values($cuotas);
		return $cuotas;
	}
	public function abonadas($fecha = null)
	{
		$estado = model(TipoEstadoPago::class)->where('descripcion', 'abonado')->findOne();
		$cuotas = $this->pagadas($fecha);
		foreach ($cuotas as $i => &$cuota) {
			if ($cuota->pago()->estado()->estado != $estado->id) {
				unset($cuotas[$i]);
			}
		}
		array_values($cuotas);
		return $cuotas;
	}
	public function rebotadas()
	{
		$estado = model(TipoEstadoPago::class)->where('descripcion', 'devuelto')->findOne();
		$cuotas = $this->cuotas();
		foreach ($cuotas as $i => &$cuota) {
			if ($cuota->pago()->estado()->estado != $estado->id) {
				unset($cuotas[$i]);
			}
		}
		array_values($cuotas);
		return $cuotas;
	}
	public function valorPesos()
	{
		return $this->valor * $this->uf();
	}
	public function valorPagado($tipo = 'uf', $fecha = null)
	{
		$cuotas = $this->pagadas($fecha);
		$sum = 0;
		foreach ($cuotas as $cuota) {
			$pago = $cuota->pago();
			if ($tipo == 'uf' or $tipo == 'ufs') {
				if ($pago->uf() == 0) {
					$sum += $pago->valor / $this->uf();
					continue;
				}
				$sum += $pago->valor / $pago->uf();
 			} else {
				$sum += $pago->valor;
			}
		}

		return $sum * $this->proporcion();
	}
	public function valorAbonado($tipo = 'uf', $fecha = null)
	{
		$cuotas = $this->abonadas($fecha);
		$sum = 0;
		foreach ($cuotas as $cuota) {
			$pago = $cuota->pago();
			if ($tipo == 'uf' or $tipo == 'ufs') {
				if ($pago->uf() == 0) {
					$sum += $pago->valor / $this->uf();
					continue;
				}
				$sum += $pago->valor / $pago->uf;
			} else {
				$sum += $pago->valor;
			}
		}

		return $sum * $this->proporcion();
	}
	public function reajuste()
	{
		$reajuste = $this->belongsTo(Pago::class, 'reajuste');
		if ($reajuste) {
			$reajuste =  $reajuste->findOne();
			return $reajuste;
		}
		return null;
	}
	public function venta()
	{
		return $this->has_one(Venta::class, 'pie')->findOne();
	}
	public function asociado()
	{
		$pie = $this->belongs_to(Pie::class, 'asociado')->findOne();
		if ($pie) {
			return $pie;
		}
		return null;
	}
	private $asociados = null;
	public function asociados()
	{
		if ($this->asociados == null) {
			$pie = $this->has_many(Pie::class, 'asociado');
			if (!$pie) {
				return null;
			}
			$asociados = $pie->findMany();
			usort($asociados, function($a, $b) {
				return strcmp($a->venta()->unidad()->descripcion, $b->venta()->unidad()->descripcion);
			});
			$this->asociados = $asociados;
		}
		return $this->asociados;
	}
	public function proporcion()
	{
		$pie = $this;
		if ($this->asociado != 0) {
			$pie = $this->asociado();
		}
		if ($pie->asociados() != null) {
			$pies = $pie->asociados();
			$base = $pie->valor;
			foreach ($pies as $p) {
				$base += $p->valor;
			}

			return $this->valor / $base;
		}
		return 1;
	}
	public function pendientes()
	{
		return count($this->cuotas()) - count($this->pagadas());
	}
	public function pagos($estado = 0)
	{
		$pagos = model(Pago::class)
			->select('pago.*')
			->join('cuota', ['cuota.pago', '=', 'pago.id'])
			->filter('filterEstado')
			->where('estado_pago.estado', $estado)
			->where('cuota.pie', $this->id)
			->findMany();
		if ($this->reajuste != 0 and $this->reajuste()->estado()->estado == $estado) {
			$pagos []= $this->reajuste();
		}
		return $pagos;
	}
	public function uf()
	{
		if ($this->uf == 0) {
			$uf = uf($this->fecha);
			if (!$uf) {
				return 1;
			}
			if ($uf->total > 0) {
				$this->uf = $uf->uf->value;
				$this->save();
			}
		}
		return $this->uf;
	}
	public function valor($tipo = 'pesos')
	{
		switch ($tipo) {
			case 'uf':
			case 'ufs':
				return $this->valor;
				break;
			case 'peso':
			case 'pesos':
			default:
				return $this->valorPesos();
				break;
		}
	}
}
?>
