<?php
    ##########################################################################
    ##########################################################################
    //VERIFICA SEGURIDAD: Perfil de Administrador requerido antes de continuar
    global $PCOSESS_LoginUsuario,$MULTILANG_ErrorTitAuth,$MULTILANG_WSErr06;
    if (!PCO_EsAdministrador(@$PCOSESS_LoginUsuario))
        {
            PCO_Mensaje("{$MULTILANG_ErrorTitAuth}", "{$MULTILANG_WSErr06}", '', 'fa fa-exclamation-triangle fa-3x texto-rojo texto-blink', 'alert alert-warning alert-dismissible');
            PCO_Auditar("$PCOSESS_LoginUsuario Intenta acceso no autorizado Frm:-46","SECLog:event");
            die();
        }
    ##########################################################################
    ##########################################################################
    
    global $FaceAPI_CodigoEnrolamientoCamara,$FaceAPI_CodigoEnrolamientoControles,$PCOVAR_ScriptPre_FaceAPI,$MULTILANG_Cerrar,$MULTILANG_Error,$TablasCore;

    //Determina si se debe incluir scripts de reconocimiento facial
    $PCO_RegistroParametrosAplicacion=PCO_EjecutarSQL("SELECT * FROM {$TablasCore}parametros WHERE 1=1 LIMIT 0,1 ")->fetch();
    if ($PCO_RegistroParametrosAplicacion["facialrec_habilitar"]!="S")
        {
            PCO_Mensaje("{$MULTILANG_Error}", "Subsistema de reconocimiento facial no se encuentra activado.<br><br>Vaya a Configuraci&oacute;n->Parametros de aplicaci&oacute;n->Reconocimiento facial y act&iacute;velo en caso que sea necesario antes de intentar usarlo.", '', 'fa fa-exclamation-triangle fa-3x texto-rojo texto-blink', 'alert alert-danger');
            echo " <a class='btn btn-danger' href='#' onclick='window.close();'>{$MULTILANG_Cerrar}</a>";
            die();
        }

    //Variables de Personalizacion del JS Face-API y maquetacion
    $ID_CampoAlmacenamientoEnForm="vectores_faciales";  //Campo existente en form sobre el que se almacenan los vectores
    $ID_CampoLlaveUnicaEnForm="login";  //Campo existente en form que contiene el valor de llave unica para asociar los vectores
    
    //Variables de configuracion en parametros del framework
    $CantidadMuestras=$PCO_RegistroParametrosAplicacion["facialrec_nromuestras"];
    $ResolucionAncho=$PCO_RegistroParametrosAplicacion["facialrec_anchocam"];
    $ResolucionAlto=$PCO_RegistroParametrosAplicacion["facialrec_altocam"];

    $FaceAPI_CodigoEnrolamientoCamara='
        <div style="text-align: left;">
            <video id="vidDisplay" style="height: '.$ResolucionAlto.'px; width: '.$ResolucionAnchopx.';" onloadedmetadata="onPlay(this)" autoplay="true"></video>
            <canvas id="overlay" style="position: absolute; top: 0; left: 0;" width = "'.$ResolucionAncho.'" height = "'.$ResolucionAlto.'">
        </div>';

    $FaceAPI_CodigoEnrolamientoControles='
        <div style="text-align: center;">
            <img id = "prof_img" style="height:'.$ResolucionAlto.'px; width: '.$ResolucionAncho.'px; border: 1px solid black; border-radius: 5px;" ></img><br><br>
            <a href="#" id="PCO_BotonCapturaMuestras" class="btn btn-primary" style="font-weight: bold;">Capturar Muestra</a><br>
            <div id="tries" style="font-size: 18px; font-family:Lucida Console,Monaco,monospace; font-weight: bold;">Muestras restantes : </div>
            <font size=1><i>Debe capturar tantas muestrsa como se soliciten, mientras mas cercano sea el decimal a 1.0 la calidad es mejor. Use el boton tantas veces como sea necesario.</i></font><br>
        </div>';

    $PCOVAR_ScriptPre_FaceAPI="
          //----------------------------GLOBAL VARIABLE FOR FACE MATCHER------------------------------------
          var faceMatcher = undefined
          //----------------------------------------------------------------------------------------------

          Promise.all([
            faceapi.nets.faceRecognitionNet.loadFromUri('inc/face-detect/models'),
            faceapi.nets.faceLandmark68Net.loadFromUri('inc/face-detect/models'),
            faceapi.nets.ssdMobilenetv1.loadFromUri('inc/face-detect/models'),
            faceapi.nets.tinyFaceDetector.loadFromUri('inc/face-detect/models')
          ]).then(start)
        
          async function start() {
                PCO_InicializarVideo_ReconocimientoFacial();
          }

          async function onPlay() {
              const videoEl = $('#vidDisplay').get(0)
              if(videoEl.paused || videoEl.ended )
                return setTimeout(() => onPlay())
        
                $('#overlay').show()
                const canvas = $('#overlay').get(0) 
                  const options = getFaceDetectorOptions()
                  const result = await faceapi.detectSingleFace(videoEl, options)
                  if (result) {
                    const dims = faceapi.matchDimensions(canvas, videoEl, true)
                    dims.height = {$ResolucionAlto}
                    dims.width = {$ResolucionAncho}
                    canvas.height = {$ResolucionAlto}
                    canvas.width = {$ResolucionAncho}
                    const resizedResult = faceapi.resizeResults(result, dims)
                    faceapi.draw.drawDetections(canvas, resizedResult)  
                  }   
              setTimeout(() => onPlay())
            }
        
          async function PCO_InicializarVideo_ReconocimientoFacial() {
              const stream = await navigator.mediaDevices.getUserMedia({ video: {} })
              const videoEl = $('#vidDisplay').get(0)
              videoEl.srcObject = stream
          }
          
          // tiny_face_detector options
          let inputSize = 160
          let scoreThreshold = 0.4
        
          function getFaceDetectorOptions() {
            return  new faceapi.TinyFaceDetectorOptions({ inputSize, scoreThreshold });
          }
        
          $(document).ready(async function(){
        
            var PCOJS_CantidadMuestras = {$CantidadMuestras};
            const descriptions = [];
        
            $('#reg_disp').show();
            $('#tries').html('Muestras restantes : ' + PCOJS_CantidadMuestras)
            $('#PCO_BotonCapturaMuestras').click(async function(){
                
              //Campo sobre el cual se tiene el valor de llave unica para el registro
              var LlaveParent=$('#{$ID_CampoLlaveUnicaEnForm}').val();
              var data = LlaveParent;
              const label = data;
                if(PCOJS_CantidadMuestras > 0 ){
                  var canvas = document.createElement('canvas');
                  var context = canvas.getContext('2d');
                  var video = document.getElementById('vidDisplay');
                  
                  context.drawImage(video, 0, 0, {$ResolucionAncho}, {$ResolucionAlto}); //600x350
                  
                  var capURL = canvas.toDataURL('image/png');
                  var canvas2 = document.createElement('canvas');
                  canvas2.width = {$ResolucionAncho};
                  canvas2.height = {$ResolucionAlto};
                  var ctx = canvas2.getContext('2d');
                  ctx.drawImage(video, 0, 0, {$ResolucionAncho}, {$ResolucionAlto});
                  var new_image_url = canvas2.toDataURL();
                  var img = document.createElement('img');
                  img.src = new_image_url;
                  document.getElementById('prof_img').src = img.src;
        
                  const detections = await faceapi.detectSingleFace(img).withFaceLandmarks().withFaceDescriptor();
                  if( detections != null){
                    descriptions.push(detections.descriptor);
                    var descrip = descriptions;
                    PCOJS_CantidadMuestras--;
                    $('#tries').html('Muestras restantes : ' + PCOJS_CantidadMuestras)
                    if(PCOJS_CantidadMuestras == 0)
                        {
                            //guardar imagen, ver sobre ajax php la ruta - Ver POST con el script
                            //Parametros POST y ajax.php estaban en comilla doble
                            /*
                                $.ajax({
                                    type: 'POST',
                                    url: 'ajax.php',
                                    data: {image: img.src ,path: data}
                                }).done(function(o) {
                                });
                            */
                            
                            var postData = new faceapi.LabeledFaceDescriptors(label, descrip);
                            
                            var PCOJS_VectoresFaceAPI = (JSON.stringify(postData))
                            //Asigna el valor de vectores al campo existente en el form
                            $('#{$ID_CampoAlmacenamientoEnForm}').val(PCOJS_VectoresFaceAPI);
                            
                            //Deshabilita el control de captura
                            $('#PCO_BotonCapturaMuestras').text('Muestras capturadas');
                            $('#PCO_BotonCapturaMuestras').unbind('click');
                            $('#PCO_BotonCapturaMuestras').attr('disabled', 'disabled');
                            
                            //Presenta boton de actualizar
                            $('#btn_actualizar').show();
                        }          
                  }
                }
            });
        
        });

        ";