<?php
namespace App\Controller;

use Carbon\Carbon;
use App\Definition\Controller;
use App\Service\Borrador;
use App\Service\Factory;
use Incoviba\old\Common\Direccion;
use Incoviba\old\Common\Region;
use Incoviba\old\Proyecto\Agente;
use Incoviba\old\Proyecto\Proyecto;
use Incoviba\old\Venta\Propietario;
use Incoviba\old\Venta\Unidad;
use Incoviba\old\Venta\Cierre;
use Incoviba\old\Venta\EstadoCierre;
use Incoviba\nuevo\Venta\Precio;
use Incoviba\nuevo\Venta\Reserva;
use Incoviba\old\Venta\TipoEstadoCierre;
use Incoviba\old\Venta\TipoValorCierre;
use Incoviba\nuevo\Venta\UnidadReserva;
use Incoviba\old\Venta\Unidad as U;

class Cierres
{
	use Controller;

	public static function add()
	{
		$proyectos = model(Proyecto::class)
			->select('proyecto.*')
			->join('estado_proyecto', ['estado.proyecto', '=', 'proyecto.id'], 'estado')
			->join('tipo_estado_proyecto', ['tipo.id', '=', 'estado.estado'], 'tipo')
			->join('etapa_proyecto', ['etapa.id', '=', 'tipo.etapa'], 'etapa')
			->whereGte('etapa.orden', 3)
			->orderByAsc('proyecto.descripcion')
			->groupBy('proyecto.id')
			->findMany();
		$regiones = model(Region::class)->order_by_asc('numeracion')->findMany();
		return view('ventas.cierres.add', compact('proyectos', 'regiones'));
	}
	public static function agregar()
	{
		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
		$id_proyecto = post('proyecto');
		$proyecto = model(Proyecto::class)->findOne($id_proyecto);
		$id_agente = post('agente');
		$agente = model(Agente::class)->findOne($id_agente);

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

		list($rut, $dv) = explode('-', str_replace('.', '', post('rut')));
		$propietario = model(Propietario::class)->findOne($rut);
		if (!$propietario) {
			$data = [
				'rut' => $rut,
				'dv' => $dv,
				'nombres' => trim(post('nombres')),
				'apellido_paterno' => post('paterno'),
				'apellido_materno' => post('materno'),
				'sexo' => post('sexo'),
				'estado_civil' => post('estado_civil'),
				'profesion' => post('profesion'),
				'direccion' => $direccion->id,
				'telefono' => post('codigo_telefono') . post('telefono'),
				'email' => post('email') . '@' . post('email_domain'),
				'representante' => 0,
				'otro' => 0
			];
			$propietario = model(Propietario::class)->create($data);
			$propietario->save();
		}

		$unis = json_decode(post('unidades'));
		$id_principal = array_shift($unis);
		$unidad = model(Unidad::class)->findOne(post('unidad' . $id_principal));
		$u = model(U::class)->findOne($unidad->id);
		if (!$u) {
			$unidad->save();
		}
		$data = [
			'unidad_id' => $unidad->id
		];
		$reserva = model(Reserva::class)->create($data);
		$reserva->save();
		foreach ($unis as $id_unidad) {
			$unidad = model(Unidad::class)->findOne(post('unidad' . $id_unidad));
			$data = [
				'reserva_id' => $reserva->id,
				'unidad_id' => $unidad->id
			];
			$ur = model(UnidadReserva::class)->create($data);
			$ur->save();
		}

		$data = [
			'proyecto_id' => $proyecto->id,
			'agente_id' => $agente->id,
			'propietario_rut' => $propietario->rut,
			'reserva_id' => $reserva->id,
			'fecha' => $f->format('Y-m-d'),
			'valor' => correctNumber(post('valor')),
			'pie' => correctNumber(post('pie')),
			'credito' => correctNumber(post('credito')),
			'estado' => 1
		];
		$cierre = model(Cierre::class)->create($data);
		$cierre->save();
		header('Location: ' . url('', ['p' => 'cierres', 'a' => 'list']));
	}
	public static function list()
	{
		$proyectos = Cierre::proyectos();

		return view('ventas.cierres.list', compact('proyectos'));
	}
	public static function show()
	{
		$id = get('cierre');
		$cierre = model(Cierre::class)->findOne($id);

		return view('ventas.cierres.show', compact('cierre'));
	}
	public static function guardar()
	{
		$proyecto = \model(Proyecto::class)->findOne(post('proyecto'));
		$fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
		$unidad = \model(Unidad::class)->findOne(post('departamento'));
		$relacionado = (post('relacionado') === true) ? true : false;
		$subrelacionado = (post('subrelacionado') === true) ? true : false;
		$precio = (float) post('precio') ?: 0;
		$input = [
			'proyecto' => $proyecto,
			'fecha' => $fecha,
			'departamento' => $unidad,
			'precio' => $precio,
			'relacionado' => $relacionado,
			'subrelacionado' => $subrelacionado,
			'unidades' => [],
			'pie' => (float) post('pie')
		];
		$ebs = 0;
		if (post('unidades') != '') {
			$unidades = json_decode(html_entity_decode(post('unidades')), true);
			foreach ($unidades as $un) {
				$u = \model(Unidad::class)->findOne($un);
				$input['unidades'] []= $u;
				if ($u->precio($fecha) !== false) {
					$ebs += $u->precio($fecha)->valor;
				}
			}
		}
		$promo = 0;
		if (post('promocion') != null) {
			$promo = (float) post('promocion');
			$input['promocion'] = $promo;
		}
		$bono = 0;
		if (post('bono') != null) {
			$bono = (float) post('bono');
			$input['bono'] = $bono;
		}
		$operador = 0;
		if (post('operador') != null) {
			$operador = ($precio - $bono - $promo) * (float) post('operador') / 100;
			$input['operador'] = $operador;
		}

		$cierre = Cierre::find($proyecto, $unidad, $precio)->findOne();
		if ($cierre === false) {
			$cierre = model(Cierre::class)->create();
			$cierre->guardar((object) $input);
		}
		$output = ['status' => 'ok', 'cierre' => $cierre->asArray()];
		return json_encode($output);
	}
	public static function aprobar()
	{
		$fecha = Carbon::today(config('app.timezone'));
		$cierre = model(Cierre::class)->findOne(post('cierre'));
		if ($cierre->estado()->tipo()->descripcion == "revisado" or $cierre->estado()->tipo()->descripcion == "rechazado") {
			$cierre->aprobar($fecha);
			return json_encode(['estado' => 'aprobado']);
		}
		return json_encode(['estado' => 'no vigente']);
	}
	public static function rechazar()
	{
		$fecha = Carbon::today(config('app.timezone'));
		$cierre = model(Cierre::class)->findOne(post('cierre'));
		if ($cierre->estado()->tipo()->vigente == 1) {
			$cierre->rechazar($fecha);
			return json_encode(['estado' => 'rechazado']);
		}
		return json_encode(['estado' => 'no vigente']);
	}
	public static function abandonar()
	{
		$id = get('cierre');
		$cierre = model(Cierre::class)->findOne($id);
		$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'abandonado')->findOne();
		$today = Carbon::today(config('app.timezone'));
		$data = [
				'cierre' => $cierre->id,
				'tipo' => $tipo->id,
				'fecha' => $today->format('Y-m-d')
		];
		$estado = model(EstadoCierre::class)->create($data);
		$estado->save();
		header('Location: ' . url('', ['p' => 'cierres', 'a' => 'list']));
	}
	public static function promesar()
	{
		$id = get('cierre');
		$cierre = model(Cierre::class)->findOne($id);
		$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'promesado')->findOne();
		$today = Carbon::today(config('app.timezone'));
		$data = [
				'cierre' => $cierre->id,
				'tipo' => $tipo->id,
				'fecha' => $today->format('Y-m-d')
		];
		$estado = model(EstadoCierre::class)->create($data);
		$estado->save();
		header('Location: ' . url('', ['p' => 'cierres', 'a' => 'show', 'cierre' => $cierre->id]));
	}
	public static function borrador()
	{
		$id = get('cierre');
		$cierre = model(Cierre::class)->findOne($id);

		$borrador = new Borrador($cierre);
		d($borrador->show());
		$borrador->create();
	}
	public static function evalue()
	{
		$proyectos = \model(Proyecto::class)->orderByAsc('descripcion')->findMany();
		return view('ventas.cierres.evaluar', compact('proyectos'));
	}
	public static function evaluar()
	{
		$proyecto = \model(Proyecto::class)->findOne(post('proyecto'));
		$fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
		$unidad = \model(Unidad::class)->findOne(post('departamento'));
		$relacionado = (post('relacionado') === 'true') ? true : false;
		$subrelacionado = (post('subrelacionado') === 'true') ? true : false;
		$precio = (float) post('precio') ?: 0;
		$neto = $precio;
		$ebs = 0;
		if (post('unidades') != '') {
			$unidades = json_decode(html_entity_decode(post('unidades')), true);
			foreach ($unidades as $un) {
				$u = \model(Unidad::class)->findOne($un);
				if ($u->precio($fecha) !== false) {
					$ebs += $u->precio($fecha)->valor;
				}
			}
		}
		$promocion = 0;
		if (post('promocion') != null) {
			$promocion = (float) post('promocion');
		}
		$bono = 0;
		if (post('bono') != null) {
			$bono = (float) post('bono');
		}
		$operador = 0;
		if (post('operador') != null) {
			$operador = ($precio - $bono - $promocion) * (float) post('operador') / 100;
		}
		$rel = 0;
		if ($relacionado) {
			$rel = ($unidad->precio($fecha)->valor) * 6 / 100;
		}
		if ($subrelacionado) {
			$rel = ($unidad->precio($fecha)->valor) * 3 / 100;
		}
		$neto = $precio - $bono - $promocion - $operador - $ebs;

		$output = [
			'unidad' => [
				'tipo' => [
					'nombre' => $unidad->tipologia()->nombre,
					'tipologia' => $unidad->tipologia()->tipologia()->descripcion
				],
				'superficie' => format('m2', $unidad->m2()) . ' m&#0178;'
			],
			'oferta' => [
				'bruto' => format('ufs', $precio, null, true),
				'neto' => format('ufs', $neto, null, true),
				'uf_m2' => format('ufs', $neto / $unidad->m2('vendible'), null, true) . '/m&#0178;',
				'fecha' => format('shortDate', $unidad->precio($fecha)->inicio()->fecha())
			],
			'lista' => [
				'precio' => format('ufs', $unidad->precio($fecha)->valor, null, true),
				'uf_m2' => format('ufs', $unidad->precio($fecha)->valor / $unidad->m2('vendible'), null, true) . '/m&#0178;'
			],
			'precios' => [
				'bruto' => format('ufs', $precio, null, true),
				'neto' => format('ufs', $neto, null, true),
				'departamento' => format('ufs', $unidad->precio($fecha)->valor, null, true),
				'relacionado' => format('ufs', $unidad->precio($fecha)->valor - $rel, null, true),
				'fecha' => format('shortDate', $unidad->precio($fecha)->inicio()->fecha())
			],
			'uf_m2' => [
				'neto' => format('ufs', $neto / $unidad->m2('vendible'), null, true) . '/m&#0178;',
				'departamento' => format('ufs', $unidad->precio($fecha)->valor / $unidad->m2('vendible'), null, true) . '/m&#0178;',
				'relacionado' => format('ufs', ($unidad->precio($fecha)->valor - $rel) / $unidad->m2('vendible'), null, true) . '/&#0178;'
			],
			'evaluacion' => Cierre::evaluar($neto, $unidad, $fecha, $rel),
			'estado' => ['id' => 0, 'descripcion' => 'no existe']
		];
		if ($rel > 0) {
			$output ['relacionado'] = [
				'precio' => format('ufs', $unidad->precio($fecha)->valor - $rel, null, true),
				'uf_m2' => format('ufs', ($unidad->precio($fecha)->valor - $rel) / $unidad->m2('vendible'), null, true) . '/&#0178;'
			];
		}
		$estado = Cierre::find($proyecto, $unidad, $precio)->findOne();
		if ($estado) {
			$output['estado'] = [
				'id' => $estado->estado()->tipo()->id,
				'cierre' => $estado->id,
				'descripcion' => $estado->estado()->tipo()->descripcion,
				'fecha' => format('shortDate', $estado->estado()->fecha)
			];
		}

		return json_encode($output);
	}
	public static function edit()
	{
		$cierre = model(Cierre::class)->findOne(get('cierre'));
		$proyectos = model(Proyecto::class)->findMany();
		$regiones = model(Region::class)->findMany();
		$valores = model(TipoValorCierre::class)->findMany();
		return view('ventas.cierres.edit', compact('cierre', 'proyectos', 'regiones', 'valores'));
	}
	public static function do_edit()
	{
		$cierre = model(Cierre::class)->findOne(get('cierre'));

		$data = [
			'calle' => post('calle'),
			'numero' => post('numero'),
			'extra' => post('extra'),
			'comuna' => post('comuna')
		];
		$direccion = (new Factory(Direccion::class))->where($data)->find();
		if (!$direccion) {
			$direccion = model(Direccion::class)->create($data);
			$direccion->save();
		}
		if (post('rut') != '') {
			$data = [
				'rut' => explode('-', str_replace('.', '', post('rut')))[0],
			];
			$propietario = (new Factory(Propietario::class))->where($data)->find();
			if (!$propietario) {
				$data = array_merge($data, [
					'nombres' => post('nombres'),
					'apellido_paterno' => post('paterno'),
					'apellido_materno' => post('materno'),
					'dv' => (post('rut')) ? explode('-', str_replace('.', '', post('rut')))[1] : '',
					'sexo' => post('sexo'),
					'estado_civil' => post('estado_civil'),
					'profesion' => post('profesion'),
					'telefono' => post('codigo_telefono') . post('telefono'),
					'email' => post('email') . '@' . post('email_domain'),
					'direccion' => $direccion->id
				]);
				$propietario = model(Propietario::class)->create($data);
				$propietario->save();
			}
		}
		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
		$data = [
			'proyecto' => post('proyecto'),
			'precio' => post('precio'),
			'fecha' => $f->format('Y-m-d'),
			'relacionado' => (post('relacionado')) ? 1 : 0,
			'propietario' => (isset($propietario) and $propietario) ? $propietario->rut : 0
		];
		foreach ($data as $field => $value) {
			if ($value != $cierre->$field) {
				$cierre->$field = $value;
			}
		}
		$cierre->save();

		$valores = model(TipoValorCierre::class)->findMany();
		foreach ($valores as $valor) {
			if (post($valor->descripcion) == '') {
				continue;
			}
			if ($cierre->valor($valor->descripcion))	{
				if ($cierre->valor($valor->descripcion)->valor != post($valor->descripcion)) {
					$v = $cierre->valor($valor->descripcion);
					$v->valor = post($valor->descripcion);
					$v->save();
				}
				continue;
			}
			$data = [
				'tipo' => $valor->descripcion,
				'valor' => post($valor->descripcion)
			];
			$cierre->addValor($data);
		}
		header('Location: ' . nUrl('cierres', 'show', ['cierre' => $cierre->id]));
	}
}
?>
