<?php namespace App\Http\Controllers;

use App\Custom\SQLConnection;
use App\Custom\Misc;
use Request;
use Session;
use DateTime;
use Illuminate\Support\Facades\Input;
use DB;

class ServiciosExternosController extends Controller {
	public static $tiempo_p_juridica = 30;
	public static $tiempo_p_fisica = 30;
	public static $tiempo_pdf = 60;
	public static $tiempo_obligaciones = 30;
  public static $provincias = array(
    '0' => 'CIUDAD AUTONOMA DE BUENOS AIRES',
    '1' => 'BUENOS AIRES',
    '2' => 'CATAMARA',
    '3' => 'CORDOBA',
    '4' => 'CORRIENTES',
    '5' => 'ENTRE RIOS',
    '6' => 'JUJUY',
    '7' => 'MENDOZA',
    '8' => 'LA RIOJA',
    '9' => 'SALTA',
    '10' => 'SAN JUAN',
    '11' => 'SAN LUIS',
    '12' => 'SANTA FE',
    '13' => 'SANTIAGO DEL ESTERO',
    '14' => 'TUCUMAN',
    '16' => 'CHACO',
    '17' => 'CHUBUT',
    '18' => 'FORMOSA',
    '19' => 'MISIONES',
    '20' => 'NEUQUEN',
    '21' => 'LA PAMPA',
    '22' => 'RIO NEGRO',
    '23' => 'SANTA CRUZ',
    '24' => 'TIERRA DEL FUEGO'
  );

	// DATOS CONTRIBUYENTES -----------------------------------------------------------------------------------
	public static function obtenerDatosContribuyentes() {
		$cuit = Request::input('cuit');
		$tiempo = (substr($cuit,0,1) != '3') ? self::$tiempo_p_fisica : self::$tiempo_p_juridica ;
		$diferencia = $tiempo;
		$errores = [];
		$url = 'http://leviatanservices.com/api/afip/taxpayer/'.$cuit.'?api-key=demo';
		$procesar = false;
		$output = '';
		$exec = '';
		$consultado = SQLConnection::backendStoreProcedure('servicios_externos_obtener_fecha_consultado', array($cuit), true);
		$persona = SQLConnection::backendStoreProcedure('info_padron', array($cuit), true);

		if ((isset($consultado)) || (count($consultado) > 0)) {
			$modificado = new DateTime($consultado->fecha);
		} else {
			$modificado = ($persona->ismodified == null) ? null : new DateTime($persona->ismodified);
		}

		$ejecutar_log = false;
		if ((isset($persona)) && (count($persona) > 0)) {
			$hoy = new DateTime();
			if ($modificado !== null){
				$diferencia = $modificado->diff($hoy);
				$diferencia = $diferencia->format('%a');
			}
			if (($modificado == null) || ($diferencia > $tiempo)) {
				// Se actualiza si no se ha modificado nunca, o si la fecha de modificación es mayor a 30 dias
				$procesar = true;
			}
		}

		if ($procesar) {
			try {
				$output = file_get_contents($url);
				if ($output !== false) {
					$output = json_decode($output, true); 
					if (isset($output['data']) && $output['success'] === true) {
						if ((isset($output['data']['nombre_persona']) && $persona->nombre_persona != $output['data']['nombre_persona'])
							|| (isset($output['data']['estado']) && $persona->estado != $output['data']['estado'])) {
							// Modificar todos los campos pasa 1 como parametro
							$exec = SQLConnection::backendStoreProcedure('actualizar_padron_servicio_afip', 
								array($persona->id_padron, $output['data']['estado'], str_ireplace('sucesion de ', '', $output['data']['nombre_persona']), 1)); 
							$ejecutar_log = true;
						} else {
							// Modificar solo la fecha en la tabla nueva
							$exec = SQLConnection::backendStoreProcedure('servicios_externos_procesar_fecha_consultado', array($cuit));
						}
						if (isset($output['data']['fecha_fallecimiento'])) {
							$exec = SQLConnection::backendStoreProcedure('insertar_datos_persona', 
								array($cuit, $output['data']['fecha_fallecimiento']));
							$ejecutar_log = true;
						}
						if ((isset($output['data']['fecha_inscripcion']) 
							&& $output['data']['fecha_inscripcion'] != '1901-01-01') 
							|| (isset($output['data']['fecha_contrato_social']) 
							&& $output['data']['fecha_contrato_social'] != '1901-01-01')) {
							$exec = SQLConnection::backendStoreProcedure('insertar_datos_sociedad', 
								array($cuit, $output['data']['fecha_inscripcion'], $output['data']['fecha_contrato_social']));
							$ejecutar_log = true;
						}
						if (isset($output['data']['domicilioFiscal']) 
							&& count($output['data']['domicilioFiscal']) > 0
							&& $output['data']['domicilioFiscal']['direccion'] != $persona->domicilio_fiscal) {
							
              $aux_provincia = (array_key_exists($output['data']['domicilioFiscal']['id_provincia'], self::$provincias )) ? self::$provincias[$output['data']['domicilioFiscal']['id_provincia']] : null;
							$exec = SQLConnection::backendStoreProcedure('insertar_domicilios', 
								array($cuit, 
									$output['data']['domicilioFiscal']['direccion'],
									$output['data']['domicilioFiscal']['localidad'],
									$output['data']['domicilioFiscal']['codigo_postal'],
									$aux_provincia
									));
							$ejecutar_log = true;
						}
						if (isset($output['data']['impuestos']) && count($output['data']['impuestos']) > 0) {
							$count = 1;
							foreach ($output['data']['impuestos'] as $key => $value) {
								$delete = ($count == 1) ? 1 : 0;
								$exec = SQLConnection::backendStoreProcedure('insertar_impuesto', 
									array($persona->id_padron, $key, $delete));
								$count++;
								$ejecutar_log = true;
							}
						}
						if (isset($output['data']['caracterizaciones']) && count($output['data']['caracterizaciones']) > 0) {
							$count = 1;
							foreach ($output['data']['caracterizaciones'] as $key => $value) {
								$delete = ($count == 1) ? 1 : 0;
								$exec = SQLConnection::backendStoreProcedure('insertar_caracterizacion', 
									array($persona->id_padron, $key, $delete));
								$count++;
								$ejecutar_log = true;
							}
						}
						if (isset($output['data']['actividades']) && count($output['data']['actividades']) > 0) {
							$count = 1;
							foreach ($output['data']['actividades'] as $key => $value) {
								$delete = ($count == 1) ? 1 : 0;
								$exec = SQLConnection::backendStoreProcedure('insertar_actividad', 
									array($persona->id_padron, $key, $delete));
								$ejecutar_log = true;
							}
						}
						if (isset($output['data']['dependencia']) 
							&& count($output['data']['dependencia']) > 0 
							&& isset($output['data']['dependencia']['id_dependencia'])
							&& $persona->id_dependencia != $output['data']['dependencia']['id_dependencia']) {
							$exec = SQLConnection::backendStoreProcedure('insertar_dependencia', 
								array($persona->id_padron, $output['data']['dependencia']['id_dependencia']));
							$ejecutar_log = true;
						}
					} else {
						// NO SE ENCONTRO EL CUIT - Registrar error en log de DB
						$errores[] = "Error: o no se encontró el CUIT en la ruta [$url]"; 
						$nombre_aux = '';
						if ((isset($persona)) && (count($persona) > 0)) {
							$nombre_aux = $persona->nombre_persona;
						}
						$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
							array($cuit, $nombre_aux, "Error: CUIT NO EXISTENTE [$cuit] en la ruta [$url]", 'GAFIP'));
					}
				} else {
					$errores[] = "Error: No se pudo acceder a la url del servicio [$url]";
				}
			} catch (Exception $e) {
				$errores[] = "Error: No se pudieron procesar los datos del CUIT [$url], datos del error: ".$e->getMessage();
			}
		}

		if ($ejecutar_log){
			$exec = SQLConnection::backendStoreProcedure('insertar_log_servicios_externos', 
				array($cuit, $persona->nombre_persona, json_encode($output), 'GAFIP'));
		}

		return response()->json([
			'cuit' => $cuit,
			'id_padron' => (isset($persona->id_padron)) ? $persona->id_padron : null,
			'ejecutar_servicio_externo' => $procesar,
			'cuit_encontrado' => ($ejecutar_log == true) ? $output['success'] : false,
			'cuit_modificado' => $ejecutar_log,
			'errores' => (isset($errores) && $errores != []) ? $errores : false ]);
	}

	// CONSTANCIAS PDF ------------------------------------------------------------------------------------------
	public static function obtenerConstanciasPDF() {
		$cuit = Request::input('cuit');
		$url_pdf = 'http://leviatanservices.com/api/afip/certificate/'.$cuit.'?api-key=demo';
		$diferencia = self::$tiempo_pdf;
		$directorio_1 = substr($cuit,0,2);
		$directorio_2 = substr($cuit,2,3);
		$directorio_3 = substr($cuit,5,3);
		$destino = env('HOST_NAS').'/'.$directorio_1.'/'.$directorio_2.'/'.$directorio_3;
		$errores = [];
		$procesado = false;
		$procesar = false;

		$output = file_get_contents($url_pdf);
		if ($output !== false) {
			// verificar si existe el cuit y si tiene PDF
			$output = json_decode($output, true); 
			if (!isset($output['data']) && !isset($output['success'])) {
				// verificar si existe el PDF en la ruta de .env HOST_NAS
				$archivo = Misc::abrirArchivo($destino.'/'.$cuit.'.pdf');
				if (is_array($archivo)) {
					// si existe verificar la fecha de modificación del archivo
					$hoy = new DateTime();
					$modificado =  new DateTime(date('Y-m-d',filemtime($destino.'/'.$cuit.'.pdf')));
					if ($modificado !== null){
						$diferencia = $modificado->diff($hoy);
						$diferencia = $diferencia->format('%a');
					}
					if (($modificado == null) || ($diferencia > self::$tiempo_pdf)) {
						// si la diferencia de fecha es mayor a tiempo_pdf reemplazar PDF
						$procesar = true;
					}
					fclose($archivo[0]);
				} else {
					// si no existe copiar el PDF
					$procesar = true;
				}

				if ($procesar) {
					// verificar si existe directorio destino
					$directorio = Misc::abrirDirectorio($destino);
					if (is_array($directorio)) {
						closedir($directorio[0]);
						if (copy($url_pdf, $destino.'/'.$cuit.'.pdf') !== false) {
							$procesado = true;
						} else {
							$errores[] = "Error: no se pudo copiar el archivo [$url_pdf] en el destino [$destino], verificar permisos.";
						}
					}elseif ((mkdir ($destino, 0777 , true) === true) && (copy($url_pdf, $destino.'/'.$cuit.'.pdf') !== false)) {
						$procesado = true;
					} else {
						$errores[] = "Error: no se pudo copiar el archivo [$url_pdf] en el destino [$destino], verificar permisos.";
					}
				}
			} else {
        $persona = SQLConnection::backendStoreProcedure('info_padron', array($cuit), true);
        if (isset($persona->id_padron)){
          $exec = SQLConnection::backendStoreProcedure('servicios_externos_procesar_cuit_sin_pdf', array($persona->id_padron, $output['error']['mensaje']), true);
        }
				$errores[] = "Error: el CUIT [$cuit] no posee PDF asociado."; 
			}
		} else {
			$errores[] = "Error: no se pudo consultar el cuit en la ruta [$url_cuit], verificar permisos.";
		}

		return response()->json([
			'cuit' => $cuit,
			'url_pdf' => $url_pdf,
			'destino' => $destino,
			'procesado' => $procesado,
			'errores' => (isset($errores) && $errores != []) ? $errores : false ]);

	}

	// VENCIMIENTO DE OBLIGACIONES -------------------------------------------------------------------------------
	public static function obtenerVencimientosDeObligaciones() {
		$cuit = Request::input('cuit');
		$url_vencimientos = 'http://leviatanservices.com/api/afip/expirationtax/'.$cuit.'?api-key=demo3';
		$diferencia = 0;
		$errores = [];
		$ultimo = SQLConnection::backendStoreProcedure('obtener_ultimo_vencimiento_obligacion', array($cuit), true);
		$procesar = false;
		$cantidad = 0;
		if (isset($ultimo) && isset($ultimo->created)) {
			$hoy = new DateTime();
			$modificado = new DateTime($ultimo->created);
			if ($modificado !== false){
				$diferencia = $modificado->diff($hoy);
				$diferencia = $diferencia->format('%a');
				if ($diferencia > self::$tiempo_obligaciones) {
					$procesar = true;
				}
			} else {
				$errores[] = "Error: Proceso fallido, no se pudo convertir a DateTime PHP la fecha de creación del último registro proveniente de BD con el SP [obtener_ultimo_vencimiento_obligacion] con el CUIT [$cuit]";
			}
		} else {
			$procesar = true;
		}

		if ($procesar) {
			try {
				$output = file_get_contents($url_vencimientos);
				if ($output !== false) {
					$output = json_decode($output, true);
					if (isset($output['data']) && is_array($output['data']) && $output['success'] === true) {
						$cantidad = count($output['data']);
						foreach ($output['data'] as $row) {
							$param = [];
							$param['cuit'] = $cuit;
							$param['periodo'] = isset($row['periodo']) ? $row['periodo'] : null;
							$param['anticipo_cuota'] = isset($row['anticipoCuota']) ? $row['anticipoCuota'] : null;
							$param['tipo_operacion'] = isset($row['tipoOperacion']) ? $row['tipoOperacion'] : null;
							$param['vencimiento'] = isset($row['vencimiento']) ? $row['vencimiento'] : null;
							$param['formularios'] = isset($row['formularios']) ? $row['formularios'] : null;
							$param['impuesto'] = isset($row['impuesto']) ? $row['impuesto'] : null;
							$param['concepto'] = isset($row['concepto']) ? $row['concepto'] : null;
							$exec = SQLConnection::backendStoreProcedure('insertar_vencimiento_obligacion', array_values($param));
						}
					} else {
						$errores[] = "Error: El cuit [$cuit] no fue encontrado en el servicio externo";
					}
				} else {
					$errores[] = "Error: No se pudo acceder a los datos del servicio a través de la url [$url_vencimientos]";
				}
			} catch (Exception $e) {
				$errores[] = "Error: No se pudieron procesar los datos del CUIT [$cuit], detalles del error: ".$e->getMessage();
			}
		}
		return response()->json([
			'cuit' => $cuit,
			'ejecutar_servicio_externo' => $procesar,
			'cantidad_rows_encontradas' => $cantidad,
			'errores' => (isset($errores) && $errores != []) ? $errores : false ]);
	}



}