<?php
namespace App\Http\Controllers;

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

class AsignacionCuitsMarcasController extends Controller {

	public static $errores;
	public static $multiplicidad;
	public static $encontrados;
	public static $buscados;

	public function iniciarProceso() {
		$tiempo_inicio = new DateTime();
		$proceso = $this->asignarCuits();
		$tiempo_fin = new DateTime();
		$tiempo_ejecucion = $tiempo_inicio->diff($tiempo_fin);
		$proceso['tiempo_ejecucion'] = $tiempo_ejecucion->format('%d días, %h horas, %i minutos, %s segundos');
		// dd($proceso);
	}

	private function asignarCuits() {
		$marcas = SQLConnection::backendStoreProcedure('backend_obtener_marcas_no_buscadas', array(), false, false);
		self::$encontrados = 0;
		self::$multiplicidad = 0;
		$no_encontrados = 0;
		self::$buscados = 0;
		self::$errores = [];
		foreach ($marcas as $pos => $marca):
			if (isset($marca->titular)) {
				$titular_limpio = Misc::limpiarString($marca->titular);
				$diccionario = Misc::diccionarioRazonesSociales($titular_limpio);
				$diccionario = is_array($diccionario) ? $diccionario : [$titular_limpio];
				$hay_multiples = false;
				$similares = [];
				foreach ($diccionario as $titular) {
					$params = [
						'titular' => '"' . $titular . '"',
					];
					$exec = SQLConnection::backendStoreProcedure('backend_busqueda_padron_marcas', array_values($params), false, false);
					if (sizeof($exec) > 0) {
						$similares = array_merge($similares, $exec);
					}
				}

				$iguales = $this->verificarResultadosUnicos($similares, $diccionario);
				$iguales = array_unique($iguales);

				if (sizeof($iguales) == 1) {
					$params = [
						'id_marca' => $marca->id,
						'cuit' => $iguales[0],
						'titular_limpio' => $titular_limpio,
						'procesado' => 1,
						'multiplicidad' => null,
						'mensaje' => null,
					];
					$this->procesarLog($params);
				} elseif (sizeof($similares) > 0) {
					$params = [
						'id_marca' => $marca->id,
						'cuit' => null,
						'titular_limpio' => $titular_limpio,
						'procesado' => null,
						'multiplicidad' => 1,
						'mensaje' => null,
					];
					$this->procesarLog($params);
				} else {
					$no_encontrados++;
				}

				$params = [
					'id_marca' => $marca->id,
					'flag' => 'B',
				];
				$this->procesarFlag($params);
			}
		endforeach;

		return compact('buscados', 'encontrados', 'no_encontrados', 'multiplicidad', 'errores');
	}

	private function verificarResultadosUnicos($similares, $diccionario) {
		$iguales = [];
		foreach ($similares as $titular) {
			$nombre = Misc::limpiarString($titular->nombre_persona);
			$nombre = str_replace(" ", "", $nombre);
			foreach ($diccionario as $razon_social) {
				$razon_social = str_replace(" ", "", $razon_social);
				if ($nombre == $razon_social) {
					$iguales[] = $titular->cuit;
				}
			}
		}
		return $iguales;
	}

	private function procesarLog($params) {
		$exec = SQLConnection::backendStoreProcedure('backend_procesar_asignacion_cuit_marcas', array_values($params), true, false);
		if (isset($exec->id)) {
			if ($params['procesado'] == 1) {
				self::$encontrados++;
			} else {
				self::$multiplicidad++;
			}
		} elseif (isset($exec->error)) {
			self::$errores[] = '[id_marca:' . $params['id_marca'] . '] Error: ' . $exec->error;
		} else {
			self::$errores[] = '[id_marca:' . $params['id_marca'] . '] Error: Something went wrong in SQL, check at [backend_procesar_asignacion_cuit_marcas]';
		}
	}

	private function procesarFlag($params) {
		$exec = SQLConnection::backendStoreProcedure('backend_procesar_flag_marcas', array_values($params), true, false);
		if (isset($exec->id)) {
			self::$buscados++;
		} elseif (isset($exec->error)) {
			self::$errores[] = '[id_marca:' . $params['id_marca'] . '] Error: ' . $exec->error;
		} else {
			self::$errores[] = '[id_marca:' . $params['id_marca'] . '] Error: Something went wrong in SQL, check at [backend_procesar_flag_marcas]';
		}
	}



}