<?php
namespace App\Controller;

use App\Definition\Controller;
use Incoviba\old\Venta\Venta;
use Incoviba\old\Common\Banco;
use Incoviba\old\Venta\Credito;
use Carbon\Carbon;
use Incoviba\old\Venta\Pago;
use Incoviba\old\Venta\EstadoPago;

class Creditos
{
	use Controller;

	protected static function setDefault()
	{
		self::$default = view('construccion');
	}
	public static function agregar()
	{
		$id = get('venta');
		if ($id == null) {
			header('Location: .');
		}
		$venta = \Model::factory(Venta::class)->findOne($id);
		return view('ventas.creditos.add', compact('venta'));
	}
	public static function agregado()
	{
		$id = get('venta');
		if ($id == null) {
			header('Location: .');
		}
		$venta = \Model::factory(Venta::class)->findOne($id);

		$banco = \Model::factory(Banco::class)->where('nombre', post('banco'))->findOne();
		$f = Carbon::createFromDate(post('y'), post('m'), post('d'), config('app.timezone'));
		$uf = uf($f);

		$pago = \Model::factory(Pago::class)->create();
		$pago->banco = $banco->id;
		$pago->fecha = $f->format('Y-m-d');
		$pago->uf = $uf->uf->value;
		$pago->valor = post('valor') * $pago->uf;
		$pago->tipo = 2;

		$credito = \Model::factory(Credito::class)->create();
		$credito->banco = $pago->banco;
		$credito->valor = $pago->valor;
		$credito->fecha = $pago->fecha;
		$credito->uf = $pago->uf;

		$pago->new();

		$credito->pago = $pago->id;
		$credito->save();

		$venta->credito = $credito->id;
		$venta->save();
		header('Location: ' . url('', ['p' => 'ventas', 'a' => 'show', 'venta' => $venta->id]));
	}
	public static function pagar()
	{
		$id = get('venta');
		$venta = \Model::factory(Venta::class)->findOne($id);
		return view('ventas.creditos.pagar', compact('venta'));
	}
	public static function pagando()
	{
		$id = get('venta');
		$venta = \Model::factory(Venta::class)->findOne($id);
		$valor = str_replace(',', '.', str_replace('.', '', post('valor')));
		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));

		$pago = $venta->credito()->pago();
		if ($pago->valor != $valor) {
			$pago->valor = $valor;
		}

		$estado = \Model::factory(EstadoPago::class)->create();
		$estado->pago = $pago->id;
		$estado->fecha = $f->format('Y-m-d');
		$estado->estado = 1;
		$estado->save();

		if ($pago->is_dirty('valor')) {
			$pago->save();
		}
		header('Location: ' . url('', ['p' => 'ventas', 'a' => 'show', 'venta' => $venta->id]));
	}
	public static function abonar()
	{
		$id = get('venta');
		$venta = \Model::factory(Venta::class)->findOne($id);
		return view('ventas.creditos.abonar', compact('venta'));
	}
	public static function abonando()
	{
		$id = get('venta');
		$venta = \Model::factory(Venta::class)->findOne($id);
		$valor = str_replace(',', '.', str_replace('.', '', post('valor')));
		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));

		$pago = $venta->credito()->pago();
		if ($pago->valor != $valor) {
			$pago->valor = $valor;
		}

		$estado = \Model::factory(EstadoPago::class)->create();
		$estado->pago = $pago->id;
		$estado->fecha = $f->format('Y-m-d');
		$estado->estado = 2;

		$estado->save();

		if ($pago->is_dirty('valor')) {
			$pago->save();
		}
		header('Location: ' . url('', ['p' => 'ventas', 'a' => 'show', 'venta' => $venta->id]));
	}
	public static function show()
	{
		$id = get('venta');
		$venta = model(Venta::class)->findOne($id);

		return view('ventas.creditos.show', compact('venta'));
	}
	public static function edit()
	{
		$id = get('venta');
		$venta = model(Venta::class)->findOne($id);

		return view('ventas.creditos.edit', compact('venta'));
	}
	public static function editado()
	{
		$id = get('venta');
		$venta = model(Venta::class)->findOne($id);

		$pago = $venta->credito()->pago();

		$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
		$uf = uf($f);
		$banco = model(Banco::class)->where('nombre', post('banco'))->findOne();
		$valor = correctNumber(post('valor')) * $uf->uf->value;

		$fields = ['valor', 'uf', 'fecha', 'banco'];
		$data = ['valor' => $valor, 'uf' => $uf->uf->value, 'fecha' => $f->format('Y-m-d'), 'banco' => $banco->id];

		$change = false;
		foreach ($fields as $field) {
			if ($pago->$field != $data[$field]) {
				$change = true;
				$pago->$field = $data[$field];
				if ($field == 'fecha') {
					$eps = $pago->estados();
					foreach ($eps as $ep) {
						if ($ep->estado == 0) {
							$ep->fecha = $data[$field];
							$ep->save();
							break;
						}
					}
				}
			}
		}

		if ($change) {
			$pago->save();
		}
		header('Location: ' . url('', ['p' => 'ventas', 'a' => 'show', 'venta' => $venta->id]));
	}
	public static function remove()
	{
		$id = get('venta');
		$venta = model(Venta::class)->findOne($id);

		$pago = $venta->credito()->pago();
		$f = Carbon::today(config('app.timezone'));

		$data = [
				'pago' => $pago->id,
				'estado' => -3,
				'fecha' => $f->format('Y-m-d')
		];
		$estado = model(EstadoPago::class)->create($data);
		$estado->save();
		$venta->credito = 0;
		$venta->save();
		header('Location: ' . url('', ['p' => 'ventas', 'a' => 'show', 'venta' => $venta->id]));
	}
	public static function pendientes()
	{
		$creditos = model(Credito::class)
			->select('credito.*')
			->join('venta', ['venta.credito', '=', 'credito.id'])
			->join('pago', ['pago.id', '=', 'credito.pago'])
			->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')
			->whereLt('estado_pago.estado', 2)
			->where('venta.estado', 1)
			->orderByAsc('estado_pago.fecha')
			->findMany();
		return view('ventas.creditos.pendientes', compact('creditos'));
	}
}
?>
