<?php
namespace App\Controller;

use Carbon\Carbon;
use App\Definition\Controller;
use Incoviba\old\Common\Direccion;
use Incoviba\old\Common\Region;
use Incoviba\nuevo\Common\Direccion as D;
use Incoviba\old\Inmobiliaria\Inmobiliaria;
use Incoviba\old\Proyecto\AvanceConstruccion;
use Incoviba\old\Proyecto\EstadoProyecto;
use Incoviba\old\Proyecto\Pagare;
use Incoviba\old\Proyecto\Proyecto;
use Incoviba\old\Proyecto\ProyectoTipoUnidad;
use Incoviba\old\Proyecto\TipoEstadoProyecto;
use Incoviba\old\Proyecto\TipoMonedaPagare;
use Incoviba\old\Venta\TipoUnidad;
use Incoviba\old\Venta\Unidad;

class Proyectos
{
	use Controller;

	protected static function setDefault()
	{
		self::$default = self::list();
	}
	public static function list()
	{
		$id_inmobiliaria = get('inmobiliaria');
		if ($id_inmobiliaria != null) {
			$proyectos = model(Proyecto::class)->where('inmobiliaria', $id_inmobiliaria);
		} else {
			$proyectos = model(Proyecto::class);
		}
		$proyectos = $proyectos->order_by_asc('descripcion')->findMany();
		return view('proyectos.list', compact('proyectos'));
	}
	public static function show()
	{
		$id_proyecto = get('proyecto');
		if ($id_proyecto == null) {
			header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'list']));
		}
		$proyecto = model(Proyecto::class)->findOne($id_proyecto);
		$estados = model(TipoEstadoProyecto::class)->findMany();
		foreach ($estados as &$estado) {
			$estado = $estado->asArray()['orden'] + 1;
		}
		$colors = [];

		$ventas_pt = (object) ['fields' => [], 'data' => [], 'totales' => [], 'vendidas' => []];
		$ventas = $proyecto->ventas('fecha');
		$months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
		if (count($ventas) > 0) {
			$inicio = $ventas[0]->fecha()->format('Y');
			$fin = $ventas[count($ventas) - 1]->fecha()->format('Y');
			$end = $ventas[count($ventas) - 1]->fecha()->format('M');
			for ($y = $inicio; $y <= $fin; $y ++) {
				foreach ($months as $month) {
					$ventas_pt->fields []= $y . ' ' . $month;
					if ($y == $fin and $month == $end) {
						break;
					}
				}
			}
		}

		foreach ($proyecto->tipologias() as $tipo) {
			if (!isset($ventas_pt->data[$tipo->tipologia->descripcion])) {
				$ventas_pt->data[$tipo->tipologia->descripcion] = [];
				$ventas_pt->data[$tipo->tipologia->descripcion] = array_fill(0, count($ventas_pt->fields), 0);
				$ventas_pt->totales[$tipo->tipologia->descripcion] = 0;
				$ventas_pt->vendidas[$tipo->tipologia->descripcion] = 0;
			}
			foreach ($tipo->tipos as $pt) {
				foreach ($pt->ventas('fecha') as $venta) {
					$ventas_pt->data[$tipo->tipologia->descripcion][array_search($venta->fecha()->format('Y M'), $ventas_pt->fields)] ++;
					$ventas_pt->vendidas[$tipo->tipologia->descripcion] ++;
				}
				$ventas_pt->totales[$tipo->tipologia->descripcion] += count($pt->unidades());
			}
		}
		foreach ($ventas_pt->data as $tipo => $data) {
			$acum = 0;
			foreach ($data as $i => $cantidad) {
				$acum += $cantidad;
				$ventas_pt->data[$tipo][$i] = round($acum / $ventas_pt->totales[$tipo] * 100, 2);
			}
		}
		$meses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
		array_walk($ventas_pt->fields, function(&$item) use ($meses, $months) {
			$item = str_replace($months, $meses, $item);
		});

		for ($i = 0; $i < 10; $i ++) {
			$colors[$i] = 'rgb(' . mt_rand(0, 255) . ', ' . mt_rand(0, 255) . ', ' . mt_rand(0, 255) . ')';
		}
		return view('proyectos.show', compact('proyecto', 'estados', 'colors', 'ventas_pt'));
	}
	public static function historial()
	{
		$proyecto = model(Proyecto::class)->findOne(get('proyecto'));
		return view('proyectos.historia', compact('proyecto'));
	}
	public static function advance()
	{
		$id_proyecto = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id_proyecto);
		$estados = model(TipoEstadoProyecto::class)->whereGt('orden', $proyecto->estado()->tipo()->orden)->orderByAsc('orden')->findMany();

		return view('proyectos.advance', compact('proyecto', 'estados'));
	}
	public static function avanzar()
	{
		$id_proyecto = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id_proyecto);
		$id_tipo = post('estado');
		$tipo = model(TipoEstadoProyecto::class)->findOne($id_tipo);
		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));

		$tipos = model(TipoEstadoProyecto::class)
			->whereGt('orden', $proyecto->estado()->tipo()->orden)
			->whereLte('orden', $tipo->orden)
			->orderByAsc('orden')
			->findMany();

		foreach ($tipos as $t) {
			$estado = model(EstadoProyecto::class)->create();
			$estado->proyecto = $proyecto->id;
			$estado->estado = $t->id;
			$estado->fecha = $f->format('Y-m-d');
			$estado->save();
		}
		header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'show', 'proyecto' => $proyecto->id]));
	}
	public static function avance()
	{
		$id = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id);
		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
		$av = post('avance') / 100;
		$ep = (double) post('estado_pago');
		$avance = model(AvanceConstruccion::class)
			->where('proyecto', $proyecto->id)
			->where('fecha', $f->format('Y-m-d'))
			->findOne();
		if (!$avance) {
			$data = [
				'proyecto' => $proyecto->id,
				'fecha' => $f->format('Y-m-d'),
				'numero' => post('numero'),
				'avance' => $av,
				'estado_pago' => $ep
			];
			$avance = model(AvanceConstruccion::class)->create($data);
		}
		$avance->save();
		header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'historial', 'proyecto' => $proyecto->id]));
	}
	public static function add()
	{
		$rut = get('inmobiliaria');

		$inmobiliarias = model(Inmobiliaria::class)->orderByAsc('abreviacion')->findMany();
		$regiones = model(Region::class)->orderByAsc('numeracion')->findMany();

		return view('proyectos.add', compact('inmobiliarias', 'rut', 'regiones'));
	}
	public static function agregar()
	{
		$proyecto = model(Proyecto::class)->where('descripcion', post('descripcion'))->where('inmobiliaria', post('inmobiliaria'))->find_one();
		if ($proyecto) {
			header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'show', 'proyecto' => $proyecto->id]));
			die();
		}
		$proyecto = model(Proyecto::class)->create();
		$proyecto->descripcion = post('descripcion');
		$proyecto->inmobiliaria = post('inmobiliaria');

		$direccion = model(Direccion::class)
			->where('calle', post('calle'))
			->where('numero', post('numero'))
			->where('extra', post('extra'))
			->where('comuna', post('comuna'))
			->findOne();
		if (!$direccion) {
			$direccion = model(Direccion::class)->create();
			$direccion->calle = post('calle');
			$direccion->numero = post('numero');
			$direccion->extra = post('extra');
			$direccion->comuna = post('comuna');
			$direccion->save();
		}

		$proyecto->direccion = $direccion->id;
		$proyecto->save();

		$fecha = Carbon::parse(post('year'), post('month'), post('day'), config('app.timezone'));
		$estado = model(EstadoProyecto::class)->create();
		$estado->proyecto = $proyecto->id;
		$estado->estado = 1;
		$estado->fecha = $fecha->format('Y-m-d');
		$estado->save();
		header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'show', 'proyecto' => $proyecto->id]));
	}
	public static function disponibles()
	{
		$id = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id);

		return view('proyectos.disponibles', compact('proyecto'));
	}
	public static function list_unidades()
	{
		$id = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id);
		$libres = model(Unidad::class)->where('proyecto', $proyecto->id)->where('pt', 0)->findMany();

		return view('proyectos.unidades.list', compact('proyecto', 'libres'));
	}
	public static function add_tipo_unidad()
	{
		$id = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id);
		$tipos = model(TipoUnidad::class)->findMany();

		return view('proyectos.tipo_unidades.add', compact('proyecto', 'tipos'));
	}
	public static function agregar_tipo_unidad()
	{
		$id = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id);
		$data = post();
		$data['proyecto'] = $proyecto->id;
		$tipo = model(ProyectoTipoUnidad::class)->where('proyecto', $data['proyecto'])
			->where('tipo', $data['tipo'])->where('nombre', $data['nombre'])->findOne();
		if ($tipo === false) {
			$tipo = model(ProyectoTipoUnidad::class)->create($data);
			$tipo->save();
		}
		header('Location: ' . nUrl('proyectos', 'list_unidades', ['proyecto' => $proyecto->id]));
	}
	public static function construccion()
	{
		$id = get('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id);
		return view('proyectos.construccion', compact('proyecto'));
	}
	public static function editar_avance()
	{
		$avance = model(AvanceConstruccion::class)->findOne(get('avance'));
		return view('proyectos.avances.edit', compact('avance'));
	}
	public static function edit_avance()
	{
		$avance = model(AvanceConstruccion::class)->findOne(get('avance'));
		$cols = [
			'day',
			'month',
			'year',
			'avance',
			'estado_pago',
			'pagado',
			'day_pago',
			'month_pago',
			'year_pago'
		];
		$data = array_filter(post(), function($key) use ($cols) {
			return (array_search($key, $cols) !== false);
		}, \ARRAY_FILTER_USE_KEY);
		$data['fecha'] = implode('-', [$data['year'], $data['month'], $data['day']]);
		unset($data['year']);
		unset($data['month']);
		unset($data['day']);
		$data['fecha_pagado'] = implode('-', [$data['year_pago'], $data['month_pago'], $data['day_pago']]);
		unset($data['year_pago']);
		unset($data['month_pago']);
		unset($data['day_pago']);
		$data['avance'] /= 100;
		$avance->edit($data);

		header('Location: ' . nUrl('proyectos', 'construccion', ['proyecto' => $avance->proyecto]));
	}
	public static function reservas()
	{
		$proyecto = model(Proyecto::class)->findOne(get('proyecto'));
		$pisos = [];
		$totales = [];
		foreach ($proyecto->unidades('departamento') as $unidad) {
			if (!isset($pisos[$unidad->piso - 1])) {
				$piso = (object) ['descripcion' => $unidad->piso, 'unidades' => []];
				$pisos[$unidad->piso - 1] = $piso;
			}
			if (!isset($totales[$unidad->linea()])) {
				$totales[$unidad->linea()] = (object) ['ventas' => 0, 'reservas' => 0];
			}
			$pisos[$unidad->piso - 1]->unidades[$unidad->linea()] = $unidad;
			if ($unidad->isVendida()) {
				$totales[$unidad->linea()]->ventas ++;
			}
			if ($unidad->isReservada()) {
				$totales[$unidad->linea()]->reservas ++;
			}
		}
		ksort($pisos);
		$max_unidades = 0;
		foreach ($pisos as $piso) {
			if (count($piso->unidades) > $max_unidades) {
				$max_unidades = count($piso->unidades);
			}
		}
		return view('proyectos.reservas.base', compact('proyecto', 'pisos', 'max_unidades', 'totales'));
	}
	public function unidades()
	{
		if (get('proyecto')) {
			$proyecto = model(Proyecto::class)->findOne(get('proyecto'));
			$libres = model(Unidad::class)->where('proyecto', $proyecto->id)->where('pt', 0)->findMany();

	                return view('proyectos.unidades.list', compact('proyecto', 'libres'));
		}
		$proyectos = model(Proyecto::class)->order_by_asc('descripcion')->findMany();
		return view('proyectos.unidades.proyectos', compact('proyectos'));
	}
}
?>
