<?php
namespace Incoviba\nuevo\Proyecto;

use Incoviba\Common\Alias\NewModel;
use Incoviba\nuevo\Inmobiliaria\Inmobiliaria;
use Incoviba\nuevo\Common\Direccion;
use Incoviba\Common\Definition\hasEstado;

/**
 * 
 * @author Aldarien
 * @property int id
 * @property string nombre
 * @property string nombre_completo
 * @property Inmobiliaria inmobiliaria_rut
 * @property Direccion direccion_id
 * @property boolean portal
 * @property string descripcion
 *
 */
class Proyecto extends NewModel
{
	use hasEstado;
	
	protected static $_table = 'proyectos';
	
	public function inmobiliaria()
	{
		return $this->belongsTo(Inmobiliaria::class, 'inmobiliaria_rut', 'rut')->findOne();
	}
	public function direccion()
    {
    	return $this->belongsTo(Direccion::class, 'direccion_id')->findOne();
    }
    
    public function participaciones()
    {
    	return $this->hasMany(ProyectoParticipe::class, 'proyecto_id')->findMany();
    }
    public function participes()
    {
    	return $this->hasManyThrough(Participe::class, ProyectoParticipe::class, 'proyecto_id', 'participe_rut', 'rut')->findMany();
    }
    public function unidades()
    {
    	return $this->hasMany(UnidadProyecto::class, 'proyecto_id')->findMany();
    }
    public function cantidad($tipo = 'departamento')
    {
    	$total = 0;
    	$unidades = $this->unidades;
    	foreach ($unidades as $unidad) {
    		if ($unidad->tipo->descripcion == $tipo) {
    			$total += $unidad->unidades->count();
    		}
    	}
    	return $total;
    }
    public function unidadesPrincipales()
    {
    	if ($this->tipoUnidades()) {
    		return $this->cantidad('departamento');
    	} else {
    		return $this->cantidad('casa');
    	}
    }
    public function pisos()
    {
    	$max_piso = 0;
    	$unidades = $this->unidades;
    	foreach ($unidades as $unidad) {
    		$piso = $unidad->unidades->max('piso');
    		if ($max_piso < $piso) {
    			$max_piso = $piso;
    		}
    	}
    	return $max_piso;
    }
    public function m2Construidos()
    {
    	$total = 0;
    	$unidades = $this->unidades;
    	foreach ($unidades as $unidad) {
    		$total += $unidad->m2->total() * $unidad->unidades->count();
    	}
    	return $total;
    }
    public function tipoUnidades()
    {
    	return (!$this->unidades->isEmpty() and $this->unidades[0]->tipo->descripcion == 'departamento');
    }
    public function ventas()
    {
    	$ventas = [];
    	foreach ($this->unidades as $up) {
    		foreach ($up->unidades as $u) {
    			if (isset($u->propiedad)) {
    				$ventas->add($u->propiedad->venta);
    			}
    		}
    	}
    	$ventas = sort($ventas, function($a, $b) {
    		return $a->propiedad->unidadPrincipal->numeracion - $b->propiedad->unidadPrincipal->numeracion;
    	});
    	return $ventas;
    }
    public function ventasActivas()
    {
    	$ventas = $this->ventas();
    	$output = [];
    	foreach ($ventas as $venta) {
    		$estado = $venta->ultimoEstado()->estado->descripcion;
    		if ($estado == 'promesado' or $estado == 'escriturado' or $estado == 'entregado') {
    			$output []= $venta;
    		}
    	}
    	return $output;
    }
    public function pVendido()
    {
    	return $this->ventasActivas()->count() / $this->unidadesPrincipales();
    }
    public function m2Vendidos()
    {
    	$ventas = $this->ventasActivas();
    	$sum = 0;
    	foreach ($ventas as $venta) {
    		$sum += $venta->propiedad->unidadPrincipal->unidadProyecto->m2->vendibles();
    	}
    	return $sum;
    }
}
