<?
class i_backgroup_process
{
  var $session_UID ;
  var $log_fname ;
  var $url_services ;
  var $url_params ;
  var $setting ;

  function __construct($url_services,$params=array())
  {
  	$this->url_services=$url_services ;
  	$this->setting=$params ;
	$this->session_UID=ENGINE()->generate_UID() ;
    $this->setting['uid']=$this->session_UID ;
    //damp_array($this) ;
    unset($GLOBALS['FILE_LOG']) ; // перед первым использованием лога надо
    $this->log_fname=FILE_LOG($this->session_UID)->log_fname ;
  }

  function panel_background_process()
    { set_time_limit(0) ;

      // загружаем файл при необходимости
      if (_sizeof($_FILES))
      {   $arr_files=ENGINE()->upload_files_to_temp_dir($this->session_UID) ;
          if (_sizeof($arr_files))
          { $this->setting['source_fname']=$arr_files[0]['source_fname'] ;
            $this->setting['upload_fname']=$arr_files[0]['upload_fname'] ;
            $this->setting['source_temp_file']=$arr_files[0]['upload_fname'] ;
          }
      }

      $log_bash='/temp/log_bash_'.$this->session_UID.'.txt' ;
      $page_output='/temp/result_page_'.$this->session_UID.'.html' ;
      $log_process='/temp/process_'.$this->session_UID.'.txt' ;


      // делаем JS вывод лога
      ?><script type="text/javascript">
            $j(document).ready(function()
            {  $j('body').everyTime(1000,'update_upload_log',function()
                {  var url='<?echo $this->log_fname?>' ;    // url для получения статики через скрипт
                   //console.log(url) ;
                   jQuery.get( url,{},exec_get_html,'json');
                }) ;

               $j('body').everyTime(1000,'update_upload_output',function()
                {  var url_output='<?echo $log_process?>' ;    // url для получения статики через скрипт
                   //console.log(url_output) ;
                   jQuery.get( url_output,{},exec_get_output,'html');
                }) ;


            })

            var last_mess_id=0 ;
            function exec_get_output(data, textStatus, jqXHR)
            { if (textStatus=='success' && data!=null)
              { if (data.indexOf('failed')>-1)
                  { console.log('stopping process by error') ;
                    $j('body').stopTime('update_upload_log') ;
                    $j('body').stopTime('update_upload_output') ;
                    data.replace(/(?:\r\n|\r|\n)/g, '<br>'); // не работает
                    $j('#panel_log_uplod').html(data) ;
                    $j('#panel_result_form').remove();
                  }
              }
            }

            function exec_get_html(data, textStatus, jqXHR)
                  { if (textStatus=='success' && data!=null) $j.each(data,function(mess_id,value)
                    {  if (mess_id!=last_mess_id)
                          { //console.log(mess_id+' => '+value.text) ;
                            $j('#panel_log_uplod').append('<div class=item>'+value.text+'</div>');
                            $j('#panel_log_uplod')[0].scrollTop = 9999;
                            if (mess_id>3) $j('body').stopTime('update_upload_output') ; // если процесс пошел - отключаем мониторинг вывода
                            last_mess_id=mess_id ;
                            if (value.text=='END')
                            {   console.log('stopping process by end') ;
                                $j('body').stopTime('update_upload_log') ;
                                $j('body').stopTime('update_upload_output') ;
                                //jQuery.get( "/temp/full_<?echo basename($this->log_fname)?>",{},exec_get_html_full,'text'); // показываем в окне полные рузультаты тайминга
                                jQuery.get( "<?echo $page_output?>",{},exec_get_html_report,'text'); // показываем в окне лог работы
                                send_ajax_request({cmd:'aspmo/reboot',no_reload_page:1}) ;
                            }
                          }
                    }) ;
                 }
            function exec_get_html_full(data, textStatus, jqXHR)
            { if (textStatus=='success' && data!=null)
                {  $j('#panel_log_uplod').html(data);
                   $j('#panel_log_uplod')[0].scrollTop = 9999;
                }
            }
            function exec_get_html_report(data, textStatus, jqXHR)
            { if (textStatus=='success' && data!=null)
                {  $j('#panel_result_form').remove();
                   $j('#panel_log_uplod').html(data);
                }
            }
        </script>
        <?
      /*?><h2>setting</h2><? damp_array($this->setting,1,-1) ;*/
      $ini_fdir='/temp/'.$this->session_UID.'.yaml' ;
      $this->save_ini_setting($ini_fdir,$this->setting) ;
      //echo 'Файл настроек импорта: <a href="'.$ini_fdir.'" target="_blank">'.$ini_fdir.'</a><br>' ;

      /*$text=file_get_contents(_DIR_TO_ROOT.'/temp/'.$this->session_UID.'.yaml') ;  ?><textarea style="width:100%;height:180px;"><?echo $text?></textarea><?*/
      // специальано для AD
      $url_domain=($GLOBALS['LS_use_localhost_in_pdf'])? 'https://localhost':_PATH_TO_SITE ;
      $url=$url_domain.$this->url_services.$this->session_UID.'/' ;
      //echo 'Скрипт сервиса:<a href="'.$url.'" target="_blank"> '.$url.'</a><br>' ;
      $cmd="/usr/bin/wget -b --timeout=0 -o "._DIR_TO_ROOT.$log_process." -O "._DIR_TO_ROOT.$page_output." --no-check-certificate '".$url."' > "._DIR_TO_ROOT.$log_bash." 2>&1 & echo $!" ;

      // запускам задание на обработку файла
      //shell_exec("bash -c '".$cmd."'");
      exec($cmd);
      //echo 'Скрипт обработки файла: <a href="'.$url.'" target=_blank>'.$url.'</a><br>' ;
      ?><div id="panel_result_form"><div style="font-size:18px;color:green;text-align:center;">Ожидайте, идет выполнение операции</div><div style="text-align:center;"><img src="/images/loading14.gif" style="width:400px;"></div></div>
        <strong>Лог работы:</strong>
        <div class="panel_background_process">
            <a href="<? echo $url?>" target="_blank"  title="Скрипт сервиса"><i class="fas fa-redo-alt"></i></a>
            <a href="<? echo $ini_fdir?>" target="_blank" title="Файл настроек импорта"><i class="fas fa-tasks"></i></a>
            <a href="/temp/full_<? echo basename($this->log_fname)?>" target="_blank"  title="Лог этапов"><i class="fas fa-receipt"></i></a>
            <a href="<? echo $page_output?>" target="_blank"  title="Отчет по работе"><i class="far fa-sticky-note"></i></a>
        </div>
        <div class=clearfix id=panel_log_uplod style="width:100%;height:200px;overflow:scroll;border:1px solid darkgreen;"></div><br>
	  <?
        //echo 'Отчет по загрузке: <a href="'.($log_process).'" target=_blank>'.basename($log_process).'</a><br>' ;
	    //echo 'Лог этапов: <a href="/temp/full_'.basename($this->log_fname).'" target=_blank>'.basename($this->log_fname).'</a><br>' ;
        //echo 'Отчет по работе: <a href="'.($page_output).'" target=_blank>'.basename($page_output).'</a><br>' ;


        ?><!--<div class="center"><button class="button cancel">Закрыть</button></div>--><?
    }

    function exec_background_process()
    {
        $log_bash='/temp/log_bash_'.$this->session_UID.'.txt' ;
        $page_output='/temp/result_page_'.$this->session_UID.'.html' ;
        $log_process='/temp/process_'.$this->session_UID.'.txt' ;

        $url_domain=($GLOBALS['LS_use_localhost_in_pdf'])? 'https://localhost':_PATH_TO_SITE ;
        $url=$url_domain.$this->url_services ;
        //echo 'Скрипт сервиса:<a href="'.$url.'" target="_blank"> '.$url.'</a><br>' ;
        $cmd="/usr/bin/wget -b --timeout=0 -o "._DIR_TO_ROOT.$log_process." -O "._DIR_TO_ROOT.$page_output." --no-check-certificate '".$url."' > "._DIR_TO_ROOT.$log_bash." 2>&1 & echo $!" ;

        exec($cmd);
    }

    function save_ini_setting($fname,$setting=array())
    {  include_once(_DIR_TO_ROOT.'/ini/spyc.php');
       $yaml = Spyc::YAMLDump($setting,4,60);
       $success=file_put_contents(_DIR_TO_ROOT.$fname,$yaml) ;
       if (!$success){?><div style="color:red;">Не удалось сохранить изменения в "<?echo $fname?>". Проверьте права доступа файлов хоста, они должны принадлежать esmo или apache</div><?}
    }
}


class i_backgroup_process_exec
{
  var $session_uid ;
  var $read_only ;
  var $view_source='' ;
  var $full_update ;
  var $log_fname='' ;
  var $page_output='' ;
  var $files ;
  var $setting ;
  var $ini_fname ;
  var $view_result_as_html=0 ;

  function __construct($options=array())
  {   $this->session_uid=ENGINE()->generate_UID() ;
      if (defined('_CUR_UID') and _CUR_UID!="") $this->session_uid=_CUR_UID ; // UID сессии либо передается в options либо идет в URL
      if ($options['uid'])     $this->session_uid=$options['uid'] ;

      $this->ini_fname=_TEMP_DIR.$this->session_uid.'.yaml' ;
      unset($GLOBALS['FILE_LOG']) ;
      $this->log_fname=FILE_LOG($this->session_uid)->log_fname ;
 	  $this->page_output='/temp/result_page_'.$this->session_uid.'.html' ;
 	  $this->log_bash='/temp/log_bash_'.$this->session_uid.'.txt' ;

      $this->load_ini_setting($options) ;


      $this->read_only=($options['read_only'])? $options['read_only']:$_GET['read_only'] ;
      $this->view_source=($options['view_source'])? $options['view_source']:$_GET['view_source'] ;
      $this->full_update=($options['full_update'])? $options['full_update']:$_GET['full_update'] ;
      if (isset($options['update_type'])) $this->full_update=($options['update_type']=='full')? 1:0 ;

	  //LOGS()->reg_log('backgroup_process_exec',$this->session_uid.'<br>'._CUR_PAGE_DIR,array('data'=>$this->setting)) ;

	  //damp_array($this) ;

  }

  function load_ini_setting($options=array())
  {
     if (file_exists($this->ini_fname))
     { include_once('Spyc.php');
       $this->setting = Spyc::YAMLLoad($this->ini_fname);
     }
     else
      { //else FILE_LOG()->append('Не найден файл конфигурации процесса "'.hide_server_dir($this->ini_fname).'"') ;
        $this->setting=$options ;
      }
  }

  // вызов через show происходит только через обращение к сервису через url
  // /services/esmo_gateway/upload_persons/01dcc86adb7b65461703460979b49d43/
  function show()
  { // для красивого вывода стилей
    ob_start() ;
  	?><link rel="stylesheet" type="text/css" href="/<?echo _CLASS_?>/style.css" charset="utf-8"><?
    /*?><h2>setting:</h2><?
    damp_array($this->setting,1,-1) ;
    ?><h2>process:</h2><?*/

	$result=$this->exec() ;

	$text=ob_get_clean() ;
	/// далее в вывод не должно выходить ничего лишнего!!!
	ob_start() ;
	    file_put_contents(_DIR_TO_ROOT.$this->page_output,$text) ;
	$text2=ob_get_clean() ;
  	if ($this->view_result_as_html) $this->show_result_as_html($result) ;
    else echo $text ;
    FILE_LOG()->append('END') ;




  }

  function exec()
  {
     return(array());
  }

  function show_result_as_html($result)
  {  if ($result['error']) echo $result['error'] ;
     else if (_sizeof($result)) foreach($result as $key=>$value) echo $key.'='.$value."\n" ;
  }

}

?>
