<?php
namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;

use DateTime;

class AsignacionCuitsGenericoController extends Controller {
	private $encontrado = false;
	private $buscado_por_nombre = false;
	private $buscado_por_domicilio = false;
	private $busquedas_adicionales = '';
	private $proceso = [];

	public function procesar($lista_sin_cuit = [], $delay_time_per_row = 1000000) {
		// delay_time_per_row tiene 1 segundo de delay por defecto
		$this->proceso['total'] = sizeof($lista_sin_cuit);
		$this->proceso['cuits_asignados'] = [];
		$this->proceso['procesados_como_multiplicidad'] = [];
		$this->proceso['no_encontrados'] = [];

		$tiempo_inicio = new DateTime();

		// Master Foreach
		foreach ($lista_sin_cuit as $pos => $row):
			$result = [];
			$this->buscado_por_nombre = false;
			$this->buscado_por_domicilio = false;
			$this->busquedas_adicionales = '';
			$this->encontrado = false;

			if (isset($row->nombre_persona) && ($row->nombre_persona != '')) {
				$diccionario = Misc::diccionarioRazonesSociales($row->nombre_persona);
				$diccionario = is_array($diccionario) ? $diccionario : [$row->nombre_persona];
				foreach ($diccionario as $nombre_persona) {
					$nombre_persona = Misc::parsearBusquedaPadron($nombre_persona);
					if (isset($row->domicilio) && ($row->domicilio != '')) {
						$result = $this->busquedaNombreYDomicilio($nombre_persona, $row->domicilio);
					}
					if (sizeof($result) == 0) {
						$result = $this->busquedaPorRazonSocial($nombre_persona);
					}
					if (((sizeof($result) == 0) || (sizeof($result) > 1)) && (isset($row->localidad) || isset($row->provincia))) {
						$result = $this->busquedaNombreLocalidadYProvincia($nombre_persona, $row->localidad, $row->provincia);
					}
					if (sizeof($result) == 1) {
						break;
					}
				} // end of foreach diccionario

				if (((sizeof($result) == 0) || (sizeof($result) > 1)) && isset($row->dni)) {
					$result = $this->busquedaPorDNI($row->dni);
				}

				if (sizeof($result) > 0) {
					// marcar en tabla de asignación en caso de encontrado o multiplicidad
					$params = [
						'id_tabla' => $row->id_tabla,
						'tabla' => $row->tabla,
						'nombre_columna' => $row->nombre_columna,
						'buscado_por_nombre' => $this->buscado_por_nombre,
						'buscado_por_domicilio' => $this->buscado_por_domicilio,
						'busquedas_adicionales' => $this->busquedas_adicionales,
						'multiplicidad' => (sizeof($result) > 1),
						'cuit' => (sizeof($result) == 1) ? $result[0]->cuit : null,
						'proceso_1' => 1,
						'proceso_2' => 0,
						'proceso_3' => 0,
						'error' => null,
					];
					$exec = SQLConnection::backendStoreProcedure('backend_insertar_asignacion_cuit', array_values($params), true);
					if (isset($exec->error)) {
						$this->proceso['errores'][] = [$row->tabla][$row->id_tabla][$row->nombre_columna]['SP backend_insertar_asignacion_cuit'][$exec->error];
					} else {
						if (sizeof($result) > 1) {
							$this->proceso['procesados_como_multiplicidad'][$row->tabla][$row->id_tabla][$row->nombre_columna] = 1;
						} else {
							$this->proceso['cuits_asignados'][$row->tabla][$row->id_tabla][$row->nombre_columna] = 1;
							if (isset($this->proceso['procesados_como_multiplicidad'][$row->tabla][$row->id_tabla][$row->nombre_columna])) {
								unset($this->proceso['procesados_como_multiplicidad'][$row->tabla][$row->id_tabla][$row->nombre_columna]);
							}
						}
					}
				}

				// marcar con flag de buscado en la tabla respectiva, para el campo/columna respectivo
				$params = [
					'flag' => 'B',
					'nombre_columna' => $row->nombre_columna,
					'id_tabla' => $row->id_tabla,
				];
				$exec = SQLConnection::backendStoreProcedure('backend_insertar_flag_' . $row->tabla, array_values($params), true);
				if (isset($exec->error)) {
					$this->proceso['errores'][] = [$row->tabla][$row->id_tabla][$row->nombre_columna]['SP backend_insertar_flag_' . $row->tabla][$exec->error];
				}
			}
			usleep($delay_time_per_row);
		endforeach;
		// end of Master Foreach

		$tiempo_fin = new DateTime();
		$multiplicidad = 0;
		$asignados = 0;
		foreach ($this->proceso['procesados_como_multiplicidad'] as $tabla) {
			$multiplicidad += sizeof($tabla);
		}
		foreach ($this->proceso['cuits_asignados'] as $tabla) {
			$asignados += sizeof($tabla);
		}
		$tiempo_de_ejecucion = $tiempo_inicio->diff($tiempo_fin);
		$this->proceso['tiempo_de_ejecucion']['meses'] = $tiempo_de_ejecucion->m;
		$this->proceso['tiempo_de_ejecucion']['dias'] = $tiempo_de_ejecucion->d;
		$this->proceso['tiempo_de_ejecucion']['horas'] = $tiempo_de_ejecucion->h;
		$this->proceso['tiempo_de_ejecucion']['minutos'] = $tiempo_de_ejecucion->i;
		$this->proceso['tiempo_de_ejecucion']['segundos'] = $tiempo_de_ejecucion->s;
		$this->proceso['procesados_como_multiplicidad'] = $multiplicidad;
		$this->proceso['cuits_asignados'] = $asignados;
		$this->proceso['no_encontrados'] = $this->proceso['total'] - ($this->proceso['cuits_asignados'] + $this->proceso['procesados_como_multiplicidad']);

		return $this->proceso;
	}

	public function busquedaPorRazonSocial($nombre_persona) {
		$this->buscado_por_nombre = true;
		$params = [
			'cuit' => null,
			'dni' => null,
			'nombre' => null,
			'domicilio' => null,
			'nombre_persona' => $nombre_persona,
		];
		return SQLConnection::backendStoreProcedure('backend_busqueda_padron_personalizada',
			array_values($params));
	}

	public function busquedaNombreYDomicilio($nombre_persona, $domicilio) {
		$this->buscado_por_domicilio = true;
		$domicilio = Misc::limpiarParametro($domicilio);
		$params = [
			'cuit' => null,
			'dni' => null,
			'nombre' => null,
			'domicilio' => $domicilio,
			'nombre_persona' => $nombre_persona,
		];
		return SQLConnection::backendStoreProcedure('backend_busqueda_padron_personalizada',
			array_values($params));
	}

	public function busquedaNombreLocalidadYProvincia($nombre_persona, $localidad, $provincia) {
		$localidad = Misc::limpiarParametro($localidad);
		$provincia = Misc::limpiarParametro($provincia);

		if (isset($localidad) && $localidad != '') {
			$this->busquedas_adicionales .= 'localidad, ';
		} else {
			$localidad = null;
		}

		if (isset($provincia) && $provincia != '') {
			$this->busquedas_adicionales .= 'provincia, ';
		} else {
			$provincia = null;
		}

		$params = [
			'nombre_persona' => $nombre_persona,
			'localidad' => $localidad,
			'provincia' => $provincia,
		];
		return SQLConnection::backendStoreProcedure('backend_busqueda_padron_complementaria',
			array_values($params));
	}

	public function busquedaPorDNI($dni) {
		$dni = filter_var($dni, FILTER_SANITIZE_NUMBER_INT);
		$dni = Misc::limpiarString($dni);
		$dni = Misc::agregarCerosAlDNI($dni);
		$this->busquedas_adicionales .= 'dni, ';
		$params = [
			'cuit' => null,
			'dni' => $dni,
			'nombre' => null,
			'domicilio' => null,
			'nombre_persona' => null,
		];
		return SQLConnection::backendStoreProcedure('backend_busqueda_padron_personalizada',
			array_values($params));
	}



}