<?php

namespace App\Http\Controllers;


use App\Http\Controllers\Controller;

use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\File;
use App\Http\Requests;

use Auth;
use DB;
use App\User as User;
use Illuminate\Http\Request;
use App\Configuracion as Configuracion;
use App\Aspirante as Aspirante;
use App\Perfil as Perfil;
use App\AspirantePerfil as AspirantePerfil;
use App\TipoDocumento as TipoDocumento;
use App\Estudio as Estudio;
use App\Distincion as Distincion;
use App\ExperienciaLaboral as ExperienciaLaboral;
use App\TipoVinculacionLaboral as TipoVinculacionLaboral;
use App\ExperienciaDocente as ExperienciaDocente;
use App\TipoVinculacionDocente as TipoVinculacionDocente;
use App\ExperienciaInvestigativa as ExperienciaInvestigativa;
use App\ProduccionIntelectual as ProduccionIntelectual;
use App\TipoProduccionIntelectual as TipoProduccionIntelectual;
use App\IdiomaCertificado as IdiomaCertificado;
use App\Tesis as Tesis;
use Zipper;
use Excel;
use Dompdf\Dompdf;
use App\Http\Controllers\HelperController;
use App\Jobs\SendCompletedForm;
use JasperPHP\JasperPHP;


class ResumenController extends Controller
{
	public function show_resumen($msg = null)
	{
		$configuracion = Configuracion::where('llave', '=', 'limit_date')->first();
		if (strtotime($configuracion['valor']) >  (time() - 5 * 3600) || Auth::user()->isAdmin()) {
			$aspirante_id = Auth::user()->id;
			$aspirante = Aspirante::find($aspirante_id);
			//Contamos la cantidad de registros de cada tipo de formulario para visualizarlos en las pestañas
			//de la plantilla (main.blade.php)
			$objeto = new HelperController();
			$count = $objeto->menu($aspirante_id);


			$perfiles_seleccionados = Perfil::join('aspirantes_perfiles', 'perfiles_id', '=', 'id')
				->where('aspirantes_id', '=', $aspirante_id)->get();

			$data = array(
				"perfiles_seleccionados" => $perfiles_seleccionados,
				"aspirante" => $aspirante,
				"msg" => $msg,
				"count" => $count
			);

			return view('resumen ', $data);
		} else {
			$data = array(
				'limit_date' => $configuracion['valor']
			);
			auth()->logout();
			return view('auth/timeout', $data);
		}
	}

	public function checkSubmition(Request $request)
	{	
		\Log::info('=== checkSubmition LLAMADO ===', [
			'user_id' => \Auth::id(),
			'method' => $request->method(),
			'url' => $request->fullUrl(),
			'input' => $request->all()
		]);
		
		try {
			
			$id = \Auth::user()->id;
			$aspirante_info = Aspirante::find($id);
			$perfiles_seleccionados = collect(
				DB::table('aspirantes_perfiles')
					->join('perfiles', 'aspirantes_perfiles.perfiles_id', '=', 'perfiles.id')
					->select('aspirantes_perfiles.perfiles_id', 'perfiles.identificador')
					->where('aspirantes_perfiles.aspirantes_id', $id)
					->get()
			);
			
			if (!$aspirante_info) {
				\Log::warning('Aspirante no encontrado', ['user_id' => $id]);
				return response()->json([
					'success' => false,
					'documentos_faltantes' => ['No se encontró la información del aspirante']
				], 404);
			}
			
			$documentos_faltantes = [];
			$todos_los_documentos_existen = true;
			
			\Log::info('Iniciando verificación de documentos', ['user_id' => $id]);
			
			// 1. Verificar Documento de Identidad
			$documento_existe = Aspirante::where('id', $id)->whereNotNull('ruta_adjunto_documento')->exists();
			\Log::info('Documento de Identidad', ['existe' => $documento_existe, 'user_id' => $id]);
			if(!$documento_existe) {
				$documentos_faltantes[] = 'Documento de Identidad';
				$todos_los_documentos_existen = false;
			}
			
			// 2. Verificar al menos 1 Título de Pregrado
			$titulo_pregrado_existe = Estudio::where('aspirantes_id', $id)
				->where('niveles_id', 1)
				->whereNotNull('ruta_adjunto')
				->exists();
			\Log::info('Título de Pregrado', ['existe' => $titulo_pregrado_existe, 'user_id' => $id]);
			if(!$titulo_pregrado_existe) {
				$documentos_faltantes[] = 'Al menos 1 Título de Pregrado';
				$todos_los_documentos_existen = false;
			}
			
			// 3. Verificar Título de Posgrado según perfil seleccionado
			$perfiles_maestria = ['TC1', 'TC5', 'C1', 'C2'];
			$requiere_doctorado = false;
			
			foreach ($perfiles_seleccionados as $perfil) {
				$identificador = $perfil->identificador;
				if (empty($identificador) || !in_array($identificador, $perfiles_maestria)) {
					$requiere_doctorado = true;
					break;
				}
			}
			
			if($perfiles_seleccionados->count() > 0) {
				if($requiere_doctorado) {
					$doctorado_existe = Estudio::where('aspirantes_id', $id)
						->where('niveles_id', 4)
						->whereNotNull('ruta_adjunto')
						->exists();
					\Log::info('Título de Doctorado requerido', ['existe' => $doctorado_existe, 'user_id' => $id]);
					
					if(!$doctorado_existe) {
						$documentos_faltantes[] = 'Título de Doctorado según perfil seleccionado';
						$todos_los_documentos_existen = false;
					}
				} else {
					$maestria_existe = Estudio::where('aspirantes_id', $id)
						->whereIn('niveles_id', [3, 4])
						->whereNotNull('ruta_adjunto')
						->exists();
					\Log::info('Título de Maestría requerido', ['existe' => $maestria_existe, 'user_id' => $id]);
					
					if(!$maestria_existe) {
						$documentos_faltantes[] = 'Título de Maestría (o superior) según perfil seleccionado';
						$todos_los_documentos_existen = false;
					}
				}
			}
			
			// 4. Verificar experiencia investigativa o profesional (al menos una)
			$experiencia_investigativa_existe = ExperienciaInvestigativa::where('aspirantes_id', $id)
				->whereNotNull('ruta_adjunto')
				->exists();
			$experiencia_profesional_existe = ExperienciaLaboral::where('aspirantes_id', $id)
				->whereNotNull('ruta_adjunto')
				->exists();
			
			\Log::info('Certificación de Experiencia Investigativa/Profesional', [
				'investigativa_existe' => $experiencia_investigativa_existe,
				'profesional_existe' => $experiencia_profesional_existe,
				'user_id' => $id
			]);
			
			if(!$experiencia_investigativa_existe && !$experiencia_profesional_existe) {
				$documentos_faltantes[] = 'Experiencia investigativa o profesional (con soportes)';
				$todos_los_documentos_existen = false;
			}
			
			// 5. Verificar experiencia docente obligatoria
			$experiencia_docente_existe = ExperienciaDocente::where('aspirantes_id', $id)
				->whereNotNull('ruta_adjunto')
				->exists();
			
			\Log::info('Certificación de Experiencia Docente', [
				'docente_existe' => $experiencia_docente_existe,
				'user_id' => $id
			]);
			
			if(!$experiencia_docente_existe) {
				$documentos_faltantes[] = 'Certificación de Experiencia Docente';
				$todos_los_documentos_existen = false;
			}
			
			// 6. Verificar Matrícula o Tarjeta Profesional o Constancia de Trámite
			$tarjeta_existe = Aspirante::where('id', $id)->whereNotNull('ruta_adjunto_tarjetaprofesional')->exists();
			\Log::info('Tarjeta Profesional', ['existe' => $tarjeta_existe, 'user_id' => $id]);
			if(!$tarjeta_existe) {
				$documentos_faltantes[] = 'Matrícula o Tarjeta Profesional o Constancia de Trámite';
				$todos_los_documentos_existen = false;
			}
			
			// 7. Verificar Tesis o Trabajo Final de Posgrado
			$tesis_existe = Tesis::where('aspirantes_id', $id)
				->whereNotNull('ruta_adjunto')
				->exists();
			\Log::info('Tesis', ['existe' => $tesis_existe, 'user_id' => $id]);
			if(!$tesis_existe) {
				$documentos_faltantes[] = 'Tesis o Trabajo Final de Posgrado';
				$todos_los_documentos_existen = false;
			}
			
			// 8. Verificar Ensayos para cada perfil seleccionado
			\Log::info('Perfiles seleccionados', [
				'count' => $perfiles_seleccionados->count(),
				'identificadores' => $perfiles_seleccionados->pluck('identificador'),
				'user_id' => $id
			]);
			
			if($perfiles_seleccionados->isEmpty()) {
				$documentos_faltantes[] = 'No hay perfiles seleccionados';
				$todos_los_documentos_existen = false;
			} else {
				foreach ($perfiles_seleccionados as $perfil) {
					$ensayo_existe = AspirantePerfil::where("aspirantes_id", $id)
						->where("perfiles_id", $perfil->perfiles_id)
						->whereNotNull('ruta_ensayo')
						->exists();
					
					\Log::info('Ensayo para perfil', [
						'perfil_id' => $perfil->perfiles_id,
						'existe' => $ensayo_existe,
						'user_id' => $id
					]);
					
					if(!$ensayo_existe){
						$perfil_identificador = DB::table('perfiles')->where('id', $perfil->perfiles_id)->value('identificador');
						$documentos_faltantes[] = 'Ensayo para perfil ' . $perfil_identificador;
						$todos_los_documentos_existen = false;
					}
				}
			}
			
			// Obtener el estado del checkbox
			$check_value = $request->input('check');
			$checkbox_marcado = ($check_value == 'on' || $check_value == 'true' || $check_value === true || $check_value == '1' || $check_value == 1);
			
			\Log::info('Resultado verificación', [
				'todos_los_documentos_existen' => $todos_los_documentos_existen,
				'checkbox_marcado' => $checkbox_marcado,
				'documentos_faltantes' => $documentos_faltantes,
				'user_id' => $id
			]);
			
			// Si todos los documentos están presentes Y el checkbox está marcado, actualizar el estado
			if($todos_los_documentos_existen && $checkbox_marcado){
				$aspirante_info->formulario_enviado = 'SI';
				$aspirante_info->save();
				\Log::info('Formulario enviado correctamente', ['user_id' => $id]);
				// Enviar notificación por email
				\dispatch(new SendCompletedForm(\Auth::user()));
			}
			
			return response()->json([
				'success' => $todos_los_documentos_existen && $checkbox_marcado,
				'documentos_faltantes' => $documentos_faltantes
			]);
		} catch (\Exception $e) {
			// Log del error para debugging
			\Log::error('Error en checkSubmition: ' . $e->getMessage(), [
				'exception' => $e,
				'user_id' => \Auth::id()
			]);
			
			return response()->json([
				'success' => false,
				'documentos_faltantes' => ['Error al procesar la solicitud']
			], 500);
		}
	}

	public function getAttachments()
	{
		$input = Input::all();
		$id = Auth::user()->id;
		$pathtofile = $this->makeAttachments($id);
		return response()->download($pathtofile)->deleteFileAfterSend(true);
	}

	public function makeAttachments($aspirante_id){
		$aspirante_info = Aspirante::find($aspirante_id);
		$userCode = $aspirante_info->codigo;
		$pathtofile = public_path() . '/file/' . $userCode . '/' . $aspirante_info->nombre . ' ' . $aspirante_info->apellido . '_adjuntos.zip';
		if(File::exists($pathtofile)){
			File::delete($pathtofile);
		}
		$HV = public_path() . '/file/' . $userCode . '/' . $aspirante_info->nombre . ' ' . $aspirante_info->apellido . '_HV.pdf';
		$this->getReport($aspirante_id);
		$files = public_path() . '/file/' . $userCode;
		Zipper::make($pathtofile)->add($files)->close();
		File::delete($HV);
		return $pathtofile;
	}

	public function getReport($aspirante_id=null)
	{
		$input = Input::all();
		if(isset($aspirante_id)){
			$aspirante = Aspirante::find($aspirante_id);
			$id = $aspirante->id;
			$userCode = $aspirante->codigo;
		}else{
			$id = Auth::user()->id;
			$userCode = Auth::user()->codigo;
		}
		

		$aspirante = Aspirante::join('tipos_documento', 'aspirantes.tipo_documento_id', '=', 'tipos_documento.id')
			->join('paises as p1', 'aspirantes.pais_nacimiento', '=', 'p1.id')
			->join('paises as p2', 'aspirantes.pais_residencia', '=', 'p2.id')
			->select(
				'aspirantes.id as id',
				'aspirantes.documento as documento',
				'tipos_documento.nombre as tipo_documento',
				'aspirantes.ciudad_expedicion_documento as ciudad_documento',
				'aspirantes.nombre as nombre',
				'aspirantes.apellido as apellido',
				'aspirantes.fecha_nacimiento as fecha_nacimiento',
				'p1.nombre as pais_nacimiento',
				'p2.nombre as pais_residencia',
				'aspirantes.direccion_residencia as direccion',
				'aspirantes.correo as correo',
				'aspirantes.created_at as fecha_registro',
				'aspirantes.updated_at as fecha_actualizacion',
				'aspirantes.ciudad_aplicante as ciudad_aplicante',
				'aspirantes.codigo as codigo',
				'aspirantes.telefono_fijo as telefono_fijo',
				'aspirantes.telefono_movil as celular'
			)->where('aspirantes.id', '=', $id)->get();
		$aspirante = $aspirante[0];

		$perfiles = Perfil::join('aspirantes_perfiles', 'perfiles_id', '=', 'id')
			->select(
				'perfiles.identificador as identificador',
				'perfiles.area_desempeno as area'
			)->where('aspirantes_id', '=', $id)->get();

		$nombre_aspirante = $aspirante->nombre . ' ' . $aspirante->apellido;
		//Generar un string con los perfiles seleccionados separados con una coma
		$perfiles_string = '';
		foreach ($perfiles as $perfil) {
			$perfiles_string = $perfiles_string . $perfil->identificador . ', ';
		}

		//Remover la última coma y espacio del string
		if (strlen($perfiles_string) > 0) {
			$perfiles_string = substr($perfiles_string, 0, strlen($perfiles_string) - 2);
		}

		$pathtofile = public_path() . '/file/' . $userCode . '/' . $nombre_aspirante . '_HV.pdf';
		if (File::exists($pathtofile)) {
			return response()->download($pathtofile);
		} else {
			$estudios = Estudio::join('paises', 'estudios.paises_id', '=', 'paises.id')
				->select(
					'estudios.titulo as titulo',
					'estudios.institucion as institucion',
					'estudios.niveles_id as niveles_id',
					'estudios.fecha_inicio as fecha_inicio',
					'estudios.fecha_finalizacion as fecha_finalizacion',
					'estudios.en_curso as en_curso',
					'paises.nombre as pais'
				)->where('aspirantes_id', '=', $id)->get();

			$distinciones = Distincion::where('aspirantes_id', '=', $id)->get();

			$experiencia_laboral = ExperienciaLaboral::join(
				'tipos_vinculacion_laboral',
				'experiencias_laboral.tipos_vinculacion_laboral_id',
				'=',
				'tipos_vinculacion_laboral.id'
			)
				->select(
					'experiencias_laboral.nombre_cargo as cargo',
					'tipos_vinculacion_laboral.nombre as tipo_vinculacion',
					'experiencias_laboral.nombre_institucion as institucion',
					'experiencias_laboral.funcion_principal as funcion',
					'experiencias_laboral.fecha_inicio as fecha_inicio',
					'experiencias_laboral.fecha_finalizacion as fecha_finalizacion',
					'experiencias_laboral.tiempo_meses as tiempo_meses',
					'experiencias_laboral.en_curso as en_curso'
				)->where('aspirantes_id', '=', $id)
				->orderBy('experiencias_laboral.fecha_inicio', 'asc')->get();

			// Recalcular tiempo en meses (texto "meses y días") para la experiencia laboral usando la lógica actual
			$experiencia_laboral->transform(function ($item) {
				if ($item->fecha_inicio && $item->fecha_finalizacion) {
					$item->tiempo_meses_texto = app('App\Http\Controllers\ExperienciaLaboralController')
						->experienciaMesesDiasTexto($item->fecha_inicio, $item->fecha_finalizacion);
				} else {
					$item->tiempo_meses_texto = $item->tiempo_meses . ' ' . ($item->tiempo_meses === 1 ? 'mes' : 'meses');
				}
				return $item;
			});

			$experiencia_docente = ExperienciaDocente::join(
				'tipos_vinculacion_docente',
				'experiencias_docente.dedicacion',
				'=',
				'tipos_vinculacion_docente.id'
			)
				->select(
					'experiencias_docente.nombre_institucion as institucion',
					'tipos_vinculacion_docente.nombre as dedicacion',
					'experiencias_docente.fecha_inicio as fecha_inicio',
					'experiencias_docente.fecha_finalizacion as fecha_finalizacion',
					'experiencias_docente.tiempo_meses as tiempo_meses',
					'experiencias_docente.en_curso as en_curso',
					'experiencias_docente.area_trabajo as area',
					'experiencias_docente.info_asignaturas as asignaturas'
				)->where('aspirantes_id', '=', $id)
				->orderBy('experiencias_docente.fecha_inicio', 'asc')->get();

			// Recalcular tiempo en meses (texto "meses y días") para la experiencia docente
			$experiencia_docente->transform(function ($item) {
				if ($item->fecha_inicio && $item->fecha_finalizacion) {
					$item->tiempo_meses_texto = app('App\Http\Controllers\ExperienciaLaboralController')
						->experienciaMesesDiasTexto($item->fecha_inicio, $item->fecha_finalizacion);
				} else {
					$item->tiempo_meses_texto = $item->tiempo_meses . ' ' . ($item->tiempo_meses === 1 ? 'mes' : 'meses');
				}
				return $item;
			});

			$experiencia_investigativa = ExperienciaInvestigativa::join(
				'paises',
				'experiencias_investigativa.paises_id',
				'=',
				'paises.id'
			)
				->select(
					'experiencias_investigativa.nombre_proyecto as proyecto',
					'experiencias_investigativa.institucion as institucion',
					'experiencias_investigativa.area_proyecto as area_proyecto',
					'experiencias_investigativa.funcion_principal as funcion_principal',
					'experiencias_investigativa.fecha_inicio as fecha_inicio',
					'experiencias_investigativa.fecha_finalizacion as fecha_finalizacion',
					'experiencias_investigativa.tiempo_meses as tiempo_meses',
					'experiencias_investigativa.en_curso as en_curso',
					'paises.nombre as pais'
				)->where('aspirantes_id', '=', $id)
				->orderBy('experiencias_investigativa.fecha_inicio', 'asc')->get();

			// Recalcular tiempo en meses (texto "meses y días") para la experiencia investigativa
			$experiencia_investigativa->transform(function ($item) {
				if ($item->fecha_inicio && $item->fecha_finalizacion) {
					$item->tiempo_meses_texto = app('App\Http\Controllers\ExperienciaLaboralController')
						->experienciaMesesDiasTexto($item->fecha_inicio, $item->fecha_finalizacion);
				} else {
					$item->tiempo_meses_texto = $item->tiempo_meses . ' ' . ($item->tiempo_meses === 1 ? 'mes' : 'meses');
				}
				return $item;
			});

			$produccion_intelectual = ProduccionIntelectual::join(
				'paises',
				'produccion_intelectual.paises_id',
				'=',
				'paises.id',
				'left outer'
			)
				->join('idiomas', 'produccion_intelectual.idiomas_id', '=', 'idiomas.id')
				->join(
					'tipos_produccion_intelectual',
					'produccion_intelectual.tipos_produccion_intelectual_id',
					'=',
					'tipos_produccion_intelectual.id'
				)
				->select(
					'produccion_intelectual.nombre as nombre_produccion',
					'produccion_intelectual.publicacion_titulo as revista',
					'produccion_intelectual.publicacion_autor as autor',
					'produccion_intelectual.paginas as paginas',
					'produccion_intelectual.año as año',
					'produccion_intelectual.ISSN as ISSN',
					'produccion_intelectual.nombre_editorial as editorial',
					'produccion_intelectual.nombre_libro as nombre_libro',
					'produccion_intelectual.tipo as tipo_articulo',
					'produccion_intelectual.volumen as volumen_revista',
					'produccion_intelectual.clasificacion_revista as clasificacion_revista',
					'produccion_intelectual.ISBN as ISBN',
					'produccion_intelectual.doi as doi',
					'produccion_intelectual.descripcion as descripcion_patente',
					'produccion_intelectual.numero_patente as numero_patente',
					'produccion_intelectual.tipo_patente as tipo_patente',
					'produccion_intelectual.entidad_patente as entidad_patente',
					'paises.nombre as pais',
					'idiomas.nombre as idioma',
					'tipos_produccion_intelectual.nombre as tipo_produccion'
				)->where('aspirantes_id', '=', $id)
				->orderBy('produccion_intelectual.año', 'asc')->get();

			$idiomas_certificados = IdiomaCertificado::join(
				'idiomas',
				'idiomas_certificado.idiomas_id',
				'=',
				'idiomas.id'
			)
				->select(
					'idiomas.nombre as idioma',
					'idiomas_certificado.nativo as nativo',
					'idiomas_certificado.nombre_certificado as certificado',
					'idiomas_certificado.puntaje as puntaje'
				)
				->where('aspirantes_id', '=', $id)->get();

			$data = array(
				'aspirante' => $aspirante,
				'perfiles' => $perfiles,
				'estudios' => $estudios,
				'distinciones' => $distinciones,
				'experiencia_laboral' => $experiencia_laboral,
				'experiencia_docente' => $experiencia_docente,
				'experiencia_investigativa' => $experiencia_investigativa,
				'produccion_intelectual' => $produccion_intelectual,
				'idiomas_certificados' => $idiomas_certificados
			);

			$pdf = \App::make('dompdf.wrapper');
			$pdf->loadView('admin/reporte', $data);
			$pdf->output();
			$dom_pdf = $pdf->getDomPDF();
			$canvas = $dom_pdf->get_canvas();
			$canvas->page_text(15, 15, 'Página {PAGE_NUM} de {PAGE_COUNT} - ' . $nombre_aspirante . ' - '
				. $perfiles_string, null, 8, array(0, 0, 0));
			$pdf->save($pathtofile);
		}
	}

}

