<?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;
use stdClass;


class AsignacionCuitsABMController2 extends Controller {

	public function index() {
		return view('asignacion-cuits/sc/asignacion_cuits_sc2');
	}

	public function obtenerNoAsignados() {
		$letra = Request::input('letra');
		$sc = [];
		//$lista_rz_letra = SQLConnection::obtenerRazonSocialPorLetra($letra);
		$no_asignados = [];
		$no_encontrados = [];
		$query_param = '';
		$total = SQLConnection::backendStoreProcedure('backend_obtener_total_no_asignados_SC', array(null), true);

		if (isset($letra)) {
			$exec = SQLConnection::backendStoreProcedure('backend_obtener_no_asignados_filtro_por_letra', array($letra[0]));
			$total_por_letra = SQLConnection::backendStoreProcedure('backend_obtener_total_no_asignados_SC', array($letra[0]), true);

			foreach ($exec as $pos => $row) {
				$contenido_resumido = $row->pub_contenido;
				$nombre_sociedad = $row->soc_nombre;
				$contenido_resumido = substr($contenido_resumido, 0, 200);
				$row = (object) Misc::convertirStringsVaciosEnNull((array) $row);
				if ($row->es_sociedad == 1) {
					$row->soc_no_procesada = true;
				}
				if ($row->es_sociedad == 0) {
					$row->int_no_procesado = true;
				}
				if (isset($contenido_resumido)) {
					$row->contenido_resumido = $contenido_resumido;
				}
				if (isset($nombre_sociedad)) {
					$row->nombre_sociedad = $nombre_sociedad;
				}
				$no_asignados[] = $row;
			}

			$exec = SQLConnection::backendStoreProcedure('backend_obtener_no_asignados_filtro_por_letra', array($letra[0]));
			$no_encontrados = [];
			foreach ($exec as $pos => $row) {
				$row = (object) Misc::convertirStringsVaciosEnNull((array) $row);
				$row->soc_no_procesada = true;
				$row->int_no_procesado = true;
				$no_encontrados[] = $row;
			}

			$no_asignados = self::agruparIntegrantesNoAsignados($no_asignados);
			$no_encontrados = self::agruparIntegrantesNoEcontrados($no_encontrados);
			$query_param = '?letra=' . $letra[0];
		}
		$no_asignados = Misc::paginarArray($no_asignados, 'sc/' . $query_param);
		$no_encontrados = Misc::paginarArray($no_encontrados, 'sc/' . $query_param);

		//dd($no_asignados);


		$convertirFormatoFecha = '\App\Custom\Misc::convertirFormatoFecha';
		$tipo_tabla = 'tabla_no_asignados';
		$view_no_asignados = view('asignacion-cuits/sc/lista_no_asignados2')->with(compact('no_asignados', 'tipo_tabla', 'convertirFormatoFecha', 'total', 'total_por_letra', 'letra'))->render();
		$no_asignados = $no_encontrados;
		$tipo_tabla = 'tabla_no_encontrados';
		$view_no_encontrados = view('asignacion-cuits/sc/lista_no_asignados2')->with(compact('no_asignados', 'tipo_tabla', 'convertirFormatoFecha', 'total', 'total_por_letra', 'letra'))->render();
		return response()->json([
			'view_no_asignados' => $view_no_asignados,
			'view_no_encontrados' => $view_no_encontrados
		]);
	}



	private static function agruparIntegrantesNoAsignados($array = []) {
		$result = [];
		foreach ($array as $pos_1 => $row_1) {
			if ($pos_1 == 0) {
				$row_1->integrantes = [];
				if ($row_1->es_sociedad == 0) {
					$row_1->integrantes[] = self::asignarIntegrante($row_1);
				}
				$result[] = $row_1;
			} else {
				$encontrado = false;
				foreach ($result as $pos_2 => $row_2) {
					if (($row_1->soc_nombre == $row_2->soc_nombre) && ($row_1->pub_archivo == $row_2->pub_archivo)) {
						if ($row_1->es_sociedad == 0) {
							$result[$pos_2]->integrantes[] = self::asignarIntegrante($row_1);
						}
						$encontrado = true;
					}
				}
				if (!$encontrado) {
					$row_1->integrantes = [];
					if ($row_1->es_sociedad == 0) {
						$row_1->integrantes[] = self::asignarIntegrante($row_1);
					}
					$result[] = $row_1;
				}
			}
		}
		return self::limpiarDatosIntegrantes($result);
	}

	private static function agruparIntegrantesNoEcontrados($array = []) {
		$result = [];
		foreach ($array as $pos_1 => $row_1) {
			if ($pos_1 == 0) {
				$row_1->integrantes = [];
				if ((isset($row_1->int_nombre) || isset($row_1->int_cuit_1) || isset($row_1->int_cuit_2) || isset($row_1->int_documento_1) || isset($row_1->int_documento_2))) {
					$row_1->integrantes[] = self::asignarIntegrante($row_1);
				}
				$result[] = $row_1;
			} else {
				$encontrado = false;
				foreach ($result as $pos_2 => $row_2) {
					if (($row_1->soc_nombre == $row_2->soc_nombre) && ($row_1->pub_archivo == $row_2->pub_archivo)) {
						if ((isset($row_1->int_nombre) || isset($row_1->int_cuit_1) || isset($row_1->int_cuit_2) || isset($row_1->int_documento_1) || isset($row_1->int_documento_2))) {
							$result[$pos_2]->integrantes[] = self::asignarIntegrante($row_1);
						}
						$encontrado = true;
					}
				}
				if (!$encontrado) {
					$row_1->integrantes = [];
					if ((isset($row_1->int_nombre) || isset($row_1->int_cuit_1) || isset($row_1->int_cuit_2) || isset($row_1->int_documento_1) || isset($row_1->int_documento_2))) {
						$row_1->integrantes[] = self::asignarIntegrante($row_1);
					}
					$result[] = $row_1;
				}
			}
		}
		return self::limpiarDatosIntegrantes($result);
	}

	private static function asignarIntegrante($row) {
		$integrante = new stdClass();
		$integrante->id = $row->id;
		$integrante->nombre = $row->int_nombre;
		$integrante->cuit_1 = $row->int_cuit_1;
		$integrante->cuit_2 = $row->int_cuit_2;
		$integrante->tipo_documento = $row->int_tipo_documento;
		$integrante->documento_1 = $row->int_documento_1;
		$integrante->documento_2 = $row->int_documento_2;
		$integrante->domicilio = $row->int_domicilio;
		$integrante->localidad = $row->int_localidad;
		$integrante->provincia_1 = $row->int_provincia_1;
		$integrante->provincia_2 = $row->int_provincia_2;
		$integrante->nacionalidad = $row->int_nacionalidad;
		$integrante->cargo_1 = $row->int_cargo_1;
		$integrante->cargo_2 = $row->int_cargo_2;
		$integrante->estado_civil = $row->int_estado_civil;
		$integrante->profesion = $row->int_profesion;
		$integrante->fecha_nac = $row->int_fecha_nac;
		$integrante->no_procesado = $row->int_no_procesado;
		return $integrante;
	}

	private static function limpiarDatosIntegrantes($array) {
		foreach ($array as $pos => $row) {
			unset($row->int_nombre);
			unset($row->int_cuit_1);
			unset($row->int_cuit_2);
			unset($row->int_tipo_documento);
			unset($row->int_documento_1);
			unset($row->int_documento_2);
			unset($row->int_domicilio);
			unset($row->int_localidad);
			unset($row->int_provincia_1);
			unset($row->int_provincia_2);
			unset($row->int_nacionalidad);
			unset($row->int_cargo_1);
			unset($row->int_cargo_2);
			unset($row->int_estado_civil);
			unset($row->int_profesion);
			unset($row->int_fecha_nac);
			unset($row->int_no_procesado);
			$array[$pos] = $row;
		}
		return $array;
	}

	// DATOS PADRONES SIMILARES ---------------------------------------------------------------------------

	public function obtenerPadronesSimilares() {
		$nombre = Request::input('nombre');
		$razon_social = Request::input('razon_social');
		$es_sociedad = Request::input('es_sociedad');
		$id_sc = Request::input('id_sc');
		$archivo = Request::input('archivo');
		$domicilio = Request::input('domicilio');
		$localidad = Request::input('localidad');
		$provincia = Request::input('provincia');
		$fecha_nac = Request::input('fecha_nac');
		$profesion = Request::input('profesion');
		$cargo = Request::input('cargo');
		$es_sociedad = (int) $es_sociedad;

		if ($es_sociedad) {
			$diccionario = Misc::diccionarioRazonesSociales($razon_social);
			$diccionario = is_array($diccionario) ? $diccionario : [$razon_social];
		}

		$params = array(
			'cuit' => null,
			'dni' => null,
			'nombre' => $nombre ?? null,
			'domicilio' => null,
			'razon_social' => isset($razon_social) ? '"' . $razon_social . '"' : null,
		);

		$params = Misc::convertirStringsVaciosEnNull($params);
		$padrones_similares = self::busquedaPadron('backend_busqueda_padron_personalizada', $params, $diccionario ?? null);

		if (is_array($padrones_similares) && sizeof($padrones_similares) == 0) {
			$params = array(
				'razon_social' => isset($razon_social) ? '"' . $razon_social . '"' : null,
				'domicilio' => $domicilio ?? null,
				'localidad' => $localidad ?? null,
				'provincia' => $provincia ?? null,
				'nombre' => $nombre ?? null,
				'fecha_nac' => $fecha_nac ?? null,
				'profesion' => $profesion ?? null,
				'cargo' => $cargo ?? null,
				'cuit_soc' => null,
			);
			$params = Misc::convertirStringsVaciosEnNull($params);
			$padrones_similares = self::busquedaPadron('backend_busqueda_padron_asociativa', $params, $diccionario ?? null);
		}

		$busqueda = $razon_social ?? $nombre;
		$tipo_tabla = 'tabla_lista_similares';

		$view = view('asignacion-cuits/sc/lista_similares')->with(compact('padrones_similares', 'id_sc', 'nombre', 'razon_social', 'es_sociedad', 'archivo', 'busqueda', 'domicilio', 'localidad', 'provincia', 'tipo_tabla'))->render();

		$buscador = view('asignacion-cuits/sc/buscador')->with(compact('id_sc', 'nombre', 'razon_social', 'es_sociedad', 'archivo', 'domicilio', 'localidad', 'provincia'))->render();

		return response()->json([
			'view' => $view,
			'buscador' => $buscador,
		]);
	}

	public function busquedaAlternativa() {
		$busqueda = Request::input('busqueda');
		$nombre = Request::input('nombre');
		$razon_social = Request::input('razon_social');
		$es_sociedad = Request::input('es_sociedad');
		$id_sc = Request::input('id_sc');
		$archivo = Request::input('archivo');
		$domicilio = Request::input('domicilio');
		$localidad = Request::input('localidad');
		$provincia = Request::input('provincia');

		$busqueda = Misc::parsearBusquedaPadron($busqueda);
		if (!empty($busqueda)) {
			$exec = SQLConnection::backendStoreProcedure('busqueda_padron', array($busqueda, 1));
		}

		$padrones_similares = [];

		if (isset($exec) && is_array($exec) && sizeof($exec) > 0) {
			foreach ($exec as $pos => $row) {
				$aux = new stdClass();
				$aux->cuit = $row->identificacion;
				$aux->id_padron = $row->id_padron;
				$aux->nombre_persona = $row->nombre_persona;
				$padrones_similares[] = $aux;
			}
		}

		$tipo_tabla = 'tabla_busqueda';

		$view = view('asignacion-cuits/sc/lista_similares')->with(compact('padrones_similares', 'id_sc', 'nombre', 'razon_social', 'es_sociedad', 'archivo', 'busqueda', 'tipo_tabla'))->render();

		$buscador = view('asignacion-cuits/sc/buscador')->with(compact('id_sc', 'nombre', 'razon_social', 'es_sociedad', 'archivo', 'domicilio', 'localidad', 'provincia'))->render();

		return response()->json([
			'view' => $view,
			'buscador' => $buscador,
		]);
	}

	private static function busquedaPadron($stored_procedure, $params, $diccionario = null) {
		if (isset($diccionario)) {
			foreach ($diccionario as $razon_social) {
				$params['razon_social'] = '"' . $razon_social . '"';
				$padrones_similares = SQLConnection::backendStoreProcedure($stored_procedure, array_values($params));
				if (is_array($padrones_similares) && sizeof($padrones_similares) > 0) {
					break;
				}
			}
		} else {
			$padrones_similares = SQLConnection::backendStoreProcedure($stored_procedure, array_values($params));
		}
		return $padrones_similares;
	}

	public function obtenerFormales() {
		$id_padron = Request::input('id_padron');
		$id_sc = Request::input('id_sc');
		$cuit = Request::input('cuit');
		$nombre = Request::input('nombre');
		$nombre_original = Request::input('nombre_original');
		$archivo = Request::input('archivo');
		$es_sociedad = Request::input('es_sociedad');
		$domicilio = Request::input('domicilio');
		$localidad = Request::input('localidad');
		$provincia = Request::input('provincia');
		$es_sociedad = (int) $es_sociedad;

		$domicilios = SQLConnection::backendStoreProcedure('obtener_domicilios_new', array($cuit, 0));
		$info = SQLConnection::backendStoreProcedure('backend_obtener_info_de_cuit', array($id_padron, $es_sociedad), true);

		$tipo_domicilio = [
			"D" => "DOMICILIO",
			"L" => "LEGAL",
			"F" => "FISCAL",
			"O" => "OTRO"
		];
		$convertirStringsVaciosEnNull = '\App\Custom\Misc::convertirStringsVaciosEnNull';


		$view = view('asignacion-cuits/sc/formales')->with(compact('id_padron', 'id_sc', 'cuit', 'nombre', 'nombre_original', 'info', 'domicilios', 'es_sociedad', 'tipo_domicilio', 'archivo', 'domicilio', 'localidad', 'provincia', 'convertirStringsVaciosEnNull'))->render();

		return response()->json([
			'view' => $view
		]);
	}

	public function obtenerRelaciones() {
		$id_padron = Request::input('id_padron');
		$id_sc = Request::input('id_sc');
		$cuit = Request::input('cuit');
		$nombre = Request::input('nombre');
		$nombre_original = Request::input('nombre_original');
		$archivo = Request::input('archivo');
		$es_sociedad = Request::input('es_sociedad');
		$domicilio = Request::input('domicilio');
		$localidad = Request::input('localidad');
		$provincia = Request::input('provincia');
		$es_sociedad = (int) $es_sociedad;

		$params = [
			'id_socio' => null,
			'cuit' => $cuit,
			'visible' => 1,
			'tipo_persona' => ($es_sociedad) ? 'j' : 'f',
		];

		$convertirFormatoFecha = '\App\Custom\Misc::convertirFormatoFecha';
		$convertirStringsVaciosEnNull = '\App\Custom\Misc::convertirStringsVaciosEnNull';

		$socios = SQLConnection::backendStoreProcedure('backend_obtener_socios', array_values($params));

		$view = view('asignacion-cuits/sc/relaciones')->with(compact('id_padron', 'id_sc', 'cuit', 'nombre', 'nombre_original', 'socios', 'es_sociedad', 'archivo', 'domicilio', 'localidad', 'provincia', 'convertirFormatoFecha', 'convertirStringsVaciosEnNull'))->render();

		return response()->json([
			'view' => $view
		]);
	}



	public function asignarCuit() {
		$id_sc = Request::input('id_sc');
		$cuit = Request::input('cuit');
		$nombre_original = Request::input('nombre_original');
		$archivo = Request::input('archivo');
		$es_sociedad = Request::input('es_sociedad');
		$es_sociedad = (int) $es_sociedad;

		$asignar_domicilio = Request::input('asignar_domicilio');
		$tipo_domicilio = Request::input('tipo_domicilio');
		$domicilio_edited = Request::input('domicilio_edited');
		$localidad_edited = Request::input('localidad_edited');
		$provincia_edited = Request::input('provincia_edited');

		$exec_1 = SQLConnection::backendStoreProcedure('backend_procesar_asignacion_de_cuit_SC', array($nombre_original, $archivo, $cuit, $es_sociedad), true);

		if (isset($asignar_domicilio) && (isset($domicilio_edited) || isset($localidad_edited) || isset($provincia_edited))) {
			$params = [
				'codpos' => null,
				'cuit' => $cuit,
				'domicilio' => $domicilio_edited,
				'email' => null,
				'fax' => null,
				'id_domicilio' => 0,
				'loc_codigo' => null,
				'loc_nombre' => $localidad_edited,
				'pai_codigo' => null,
				'pai_nombre' => null,
				'prv_codigo' => null,
				'prv_nombre' => $provincia_edited,
				'telefono' => null,
				'tipo_domicilio' => $tipo_domicilio,
			];

			$params = Misc::convertirStringsVaciosEnNull($params);


			$exec_2 = SQLConnection::backendStoreProcedure('procesar_domicilio', array_values($params), true);
		}

		return response()->json([
			"success_cuit" => isset($exec_1->id_sc),
			"asignar_domicilio" => isset($asignar_domicilio),
			"success_domicilio" => (isset($exec_2) && isset($exec_2->id_domicilio)) ? true : false,
		]);
	}

	public function busquedaEnTextos() {
		$busqueda = Request::input('busqueda');
		$tipo_busqueda = Request::input('tipo_busqueda');
		$view = '';

		if (isset($busqueda) && isset($tipo_busqueda)) {
			$params = [
				'nombre' => null,
				'documento' => null,
			];
			$diccionario = [];

			if ($tipo_busqueda == 'nombre') {
				$busqueda = Misc::limpiarString($busqueda);
				if (!is_numeric($busqueda)) {
					$diccionario = Misc::diccionarioRazonesSociales($busqueda);
					$diccionario = is_array($diccionario) ? $diccionario : [$busqueda];
				}
			} elseif ($tipo_busqueda == 'cuit') {
				$busqueda = Misc::limpiarString($busqueda);
				if (is_numeric($busqueda)) {
					$diccionario = Misc::diccionarioCuits($busqueda);
				}
			} elseif ($tipo_busqueda == 'dni') {
				$busqueda = Misc::limpiarString($busqueda);
				if (is_numeric($busqueda)) {
					$diccionario = Misc::diccionarioDNIs($busqueda);
				}
			}

			$textos = self::busquedaEdictos('backend_obtener_edictos_por_contenido_archivo', $params, $diccionario, $tipo_busqueda);
			$view = view('/asignacion-cuits/sc/lista_textos')->with(compact('textos'))->render();
		}

		return response()->json([
			'view' => $view,
		]);
	}

	private static function busquedaEdictos($stored_procedure, $params, $diccionario, $tipo_busqueda) {
		$textos = [];
		$diccionario_aux = $diccionario;
		if (isset($diccionario)) {
			foreach ($diccionario as $busqueda) {
				if ($tipo_busqueda == 'nombre') {
					$params['nombre'] = '"' . $busqueda . '"';
				} elseif (($tipo_busqueda == 'cuit') || ($tipo_busqueda == 'dni')) {
					$params['documento'] = $busqueda;
				}
				$exec = SQLConnection::backendStoreProcedure($stored_procedure, array_values($params));
				if (is_array($exec) && sizeof($exec) > 0) {
					foreach ($exec as $key => $archivo) {
						$tamaño_original = strlen($archivo->texto);
						foreach ($diccionario_aux as $value) {
							$exec[$key]->texto = Misc::resaltarStringEnContenido(str_replace('"', '', $value), $archivo->texto);
							if (strlen($exec[$key]->texto) > $tamaño_original) {
								break;
							}
						}
					}
					$textos = array_merge($textos, $exec);
				}
			}
		}
		return $textos;
	}


}
