<?

class Bt_different {

	// для служебного использования. Тесты скорости
	// удаление всех данных из js графика чтения
	static function del_all_in_graph() {
		$res = my_message_dialog('Точно удалить все данные из графика?', "да\r\nнет");
		if($res == 1) return false;

		unlink('converted_read_blocks.js');

		print "ok";
	}

	// для служебного использования. Тесты скорости
	static function convert_read_blocks_graph() {
		GLOBAL $Paths, $OP;

		$output_file = 'converted_read_blocks.js';

		$read_blocks_path = $Paths->data_file('read_blocks.txt');
		if(!file_exists($read_blocks_path)) {
			print "Нет файла $read_blocks_path";
			return false;
		}

		$lines = file($read_blocks_path);
		unset($lines[0]);

		$speed_mas = array();
		foreach($lines as $line) {
			list($status, $speed, $fnomer) = explode(" ", $line);

			if(!$fnomer) continue;

			$speed_mas[$fnomer] = $speed;
		}

		$all_speed_str = implode(',' , $speed_mas);

		$data_name = c('Fm->convert_graph_title')->text;


		// определяем массив если файла нет
		if(!file_exists($output_file))
			file_put_contents($output_file, "document.converted_read_blocks = [];\n");

		// если такое имя уже есть, добавляем к нему время
		if(strpos(file_get_contents($output_file), $data_name)) {
			$data_name = $data_name . '_'.date("H:i:s");
		}

		//$data_name = mb_convert_encoding($data_name, "UTF-8");

		$output = "document.converted_read_blocks.push({name: '$data_name', lineWidth: 1, data: [$all_speed_str]});\n";
		file_put_contents($output_file, $output, FILE_APPEND);

		print "ok";
	}


	// ВНИМАНИЕ!
	// это работает криво, потому что сбросить настройки можно только на первом этапе да
	// да и вообще, наверняка что нибудь не то перезатрем. ТАк что надо почеловечески в код read_blocks.php изменения вносить а не пытаться с помощью установок настроек вопрос решить
	static function checkbox_mode_speedtest($self) {
		GLOBAL $setting, $OP, $Paths, $INFO, $Ui_fields;

		if($self->state == 'cbChecked')
			 $activating = true;
		else $activating = false;
		

		$fname = 'mode_speedtest_' . Setting::NORMAL_FILE; 

		// если человек активирует режим, сохраняем настройки в спец файле
		// и устанавливаем все настройки чтения для режима
		if($activating) {
			$OP['mode_speedtest'] = false;
			//$Ui_fields['mode_speedtest']->set(false);
			//$setting->save(false, $fname);
			/*print "Настройки изменены чтобы правильно работал режим тестирования скорости
			После отключения режима, настройки буду возвращены в нормальное состояние";
			*/

			$Ui_fields['autobad_size']->set(0);
			$Ui_fields['good_speed']->set(0.01);
			$Ui_fields['antifrag_speed']->set(0.009);
			$Ui_fields['antifrag_size']->set(0);
			$Ui_fields['sect_speed']->set(0.008);
			
		}
		// просто восстанавливаем настройки из спец файла, а если его нет, скидываем на дефолт
		else {
			$backup_info = $INFO;

			// $fpath = $Paths->data_file($fname);

			// if(file_exists($fpath))
			// 	$setting->load(false, $fname);
			// else 
			// 	$setting->load('def');

			$setting->load('def');
			$INFO = $backup_info;

			//$Ui_fields['mode_speedtest']->set(false); // поскольку при сохранении он наверное уже был включен
		}

	}


	// кнопка пропустить все оставшиеся сектора
	// не используется!
	// static function skip_nextall_sect() {
	// 	GLOBAL $INFO;
		
	// 	if($INFO['step'] == CREATE_BLOCKS) {
	// 		Ui_create_blocks::skip_all_sect();
	// 	}
	// 	elseif($INFO['step'] == READ_BLOCKS) {
	// 		 Ui_read_blocks::restart_and_skip_files('all');
	// 	} 
	// }


	static function graph_speed_zoom($procent) {
		GLOBAL  $Graphs, $log;

		c('Fm->grSpeed_zoom_value')->text = $procent.'%';

		$Graphs['speed']->zoom_max_width = $procent/100;

		// если таблица пустая, не зумим
		if(!$max = $Graphs['speed']->get_max_value())
			return true;

		$new = $max*($procent/100);
		$Graphs['speed']->set_max_value($new);
	}



	// переход к первому этапу и очистка папки с блоками
	static function clear_folder_bad_blocks() {
		GLOBAL $Bt_run, $INFO, $OP, $Ui_thread, $log;

		// пишем сначала что пиздец сейчас будет
		if($INFO['step'] == FINAL_BLOCKS)
			 $text = "ВНИМАНИЕ. ОПТИМИЗАЦИЯ СБРОСИТСЯ!\n Медленные и битые сектора будут разблокированы.";
		elseif($INFO['step'] == CREATE_BLOCKS)
			 $text= "ВНИМАНИЕ. Все тестовые файлы будут удалены. А так же блокирующие медленные сектора (если есть)";
		else $text = "ВНИМАНИЕ. ВСЕ ЭТАПЫ БУДУТ СБРОШЕНЫ и тестовые файлы удалены.";

		$res = messageDlg($text, mtWarning, MB_OKCANCEL);
		if($res == 2)
			return false;

		// убиваем процесс если запущен
		if($Ui_thread->check_run()) {
			$log->line('Останавливаем этап');
			$Bt_run->stop($INFO['step']);
			sleep(1);
		}

		// перейти на первый этап
		$bt = new Bt_repeat(CREATE_BLOCKS);
        	$bt->onClick();

		// запуск нужно, он сработает автоматом в ui_events но если этапе и так create_blocks, ui_events не срабоатет
        	// автоматический запуск
        	// проверка, вдруг он уже запустился из ui_events например
        	// устанавливаем после перехода на этап, и тогда там потом точно не запуститься
        	$INFO['create_blocks.mode_onli_cleaning'] = true;

        	if(!$Ui_thread->check_run()) {
        		$Bt_run->start(CREATE_BLOCKS);
        	}
        	$INFO['create_blocks.mode_onli_cleaning'] = false; //на всякий случай
	}


	// обновляем лог чтобы определить что программа зависла
	// вызывается в отдельном таймере, в котором больше ничего нет.
	// Основном таймер может останавливаться из-за 
	static function change_file_is_run() {
		GLOBAL $log;
		// проблема в том что пока не закроем файл, его дата изменения не обновиться!
		// поэтому используем file_put_contents как самый производительный вариант
		static $fh = false, $last_time_write = 0;

		// UP. Обработчик ошибки сам перезапустит программу. Здесь это больше не нужно.
		// если проблемы с памятью, перестаем отмечаться в is_run и crash_control сам перезапустит программу
		// на данным момент проблемы с памятью связаны только с многочисленным запуском потоков
		// if(!empty($GLOBALS['error_out_of_memory']))
		// 	return true;

//		$log->line('s' . microtime(true));

		//if(!$fh) {
		//	file_put_contents('is_run.txt', '1'); // создаем файл
		//	$fh = fopen('is_run.txt', 'r+');
		//}

		if(time() > $last_time_write + 7) {
			file_put_contents('is_run.txt', ' '/*date("H:i:s")*/);
			// fseek($fh, -1, SEEK_END);
			// fwrite($fh, '1');
			// fclose($fh);
			$last_time_write = time();
		}
	}

	// начать текущий этап заново
	static function cur_step_reset() {
		GLOBAL $INFO, $Ui_thread, $Bt_run;

		// для этапа записи, надо удалять еще сами блоки
		if($INFO['step'] == CREATE_BLOCKS)  {
			Stat::clear_step(CREATE_BLOCKS);
			self::clear_folder_bad_blocks();
			return true;
		}
		
		$res = messageDlg("Сбросить прогресс текущего этапа?", mtWarning, MB_OKCANCEL);
		if($res == 2)
			return false;

		// убиваем процесс если запущен
		if($Ui_thread->check_run()) 
			$Bt_run->stop($INFO['step']);

		Stat::clear_step($INFO['step']);
	}

	// перейти к этапу
	static function step_repeat($step_name)  {

		// для финальных операций, сообщение не нужно. Потому что за ним ничего больше не идет.
		// да и его перезапускают только для дообработки после демо.
		if($step_name != FINAL_OPERATIONS) {
			$res = messageDlg("Перейти к этапу? Этап автоматически не запустится. Все идущие за ним, так же придется проходить повторно.", mtWarning, MB_OKCANCEL);
			if($res == 2)
				return false;
		}

        	$bt = new Bt_repeat($step_name);
        	$bt->onClick();
	}

	// кнопка увеличения/уменьшения высоты графика
	static function graph_height($graph_name, $add_h) {
		GLOBAL $OP, $GOP, $Graphs;

		$speed_wrap = get_ui('Fm->graph_speed_wrap');
		$frags_wrap = get_ui('Fm->graph_frags_wrap');

		$wrap = get_ui("Fm->graph_{$graph_name}_wrap");
		$wrap->h = $wrap->h + $add_h;
		$Graphs[$graph_name]->adapt_size();


		//get_ui('graph_speed_h')->caption = $speed_wrap->h;

		// двигаем график фрагметов чтобы между ним и графиком скоростей не было дырок
		$frags_wrap->y =  $speed_wrap->h + $speed_wrap->y + $GOP['space_between_graphs'];

		if(isset($GLOBALS['All_canvas']))
			foreach($GLOBALS['All_canvas'] as $obj)
				$obj->canvas_refresh();

	}

	// справка и настройка speedfan
	static function speedfan_help() {
		GLOBAL $Forms;

		$Forms['fmHelp']->open_img('help/speedfan/speedfan_setting.png', 790, 600);
	}

	static function pause() {
		GLOBAL $log, $Ui_thread, $Forms, $Tempr_control;

		// останавливаем процесс
		$Ui_thread->pause();

		// нельяз так просто это здесь отключить, иначе сразу после остановки, начнется запись
		// диалог останавлиевает выполнение только вызвавшей функции но не таймеров
		c('Fm->dlPause')->execute();
		//messageDlg($msg, mtInformation, MB_OK);

		$Ui_thread->resume();
	}


	// кнопка пересчитать на графике фрагментов
	static function graph_frags_recalc() {
		GLOBAL $Bt_run;
		
		$Bt_run->onClick('analize_blocks');
		с('Fm->graph_frags_recalc')->visible = 0;
	}

	// панель настроек
	static function panel_setting() {
		GLOBAL $Ui_thread, $log;
		STATIC $normal_h = false, $scrollbox_normal_y = false;

		$form_root = с(Form_root::$name);
		$pn_setting = c('Fm->pn_setting');

		// показываем панель
		if(!$pn_setting->visible) {

			if(!$normal_h) {
				$normal_h = $pn_setting->h;
				$scrollbox_normal_y = c('Fm->pn_setting_scrollbox')->y;
			}

			$x = ($form_root->w - $pn_setting->w)/2; // делаем по центру
			$y = 50 * Ui_adapt_size::$pxRatio;

			//$log->line("$y + $pn_setting->h > $form_root->clientHeight");

			if($y + $normal_h > $form_root->clientHeight) { // 
				$pn_setting->h = $form_root->clientHeight - $y;
			}
			else $pn_setting->h = $normal_h;

			c('Fm->pn_setting_scrollbox')->h = $pn_setting->h - $scrollbox_normal_y;

			//$log->line("$pn_setting->h");

			show_hide('Fm->pn_setting', $x, $y);

			$view = $Ui_thread->check_run();
			c('Fm->pn_setting_msg_restart')->visible = $view;

			$pn_setting->toFront();
			Hint::toFront(); // справка ведь должны быть выше всего
		}
		// скрываем панель, проверив настройки
		else {
			//если проверки прошли успешно, скрываем
			if(Ui_create_blocks::check_setting() and Ui_read_blocks::check_setting()) {
				show_hide('Fm->pn_setting');	
			}
		}
	}

	// НЕ используется
	// Панель продвинутых настроек
	// static function step_advance_setting($step_name, $show_button_obj='') {
	// 	GLOBAL $log, $INFO, $Ui_steps_story;
		
	// 	$x = false;
	// 	$y = false;

	// 	$panel_name = $step_name . '_advance';
	// 	$panel = get_ui($panel_name);
	// 	$form = get_ui('Fm');

	// 	// на нее будем равная панель с настройками
	// 	$details_panel = get_ui('details_' . $step_name);

	// 	if($panel->visible == 0) {
	// 		if(!$Ui_steps_story->steps[$step_name]->is_active_fields) //is_active_fields удалили
	// 			messageDlg("Для изменения настроек, этап должен быть активным", mtInformation, MB_OK);
	// 	}

	// 	$x = $details_panel->x +  $details_panel->w;
	// 	$y = $details_panel->y;

	// 	// чтобы панелька не выходила за рамки формы
	// 	if($y + $panel->h > $form->clientHeight) {
	// 		//$log->line('panel_h '. $panel->h . ', form_h ' . $form->h . ');
	// 		$y = $form->clientHeight - $panel->h; // 
	// 	}
	// 	//$log->line("$x, $y");

	// 	// перемещаем на самый верх
	// 	$panel->toFront();

	// 	show_hide($panel_name, $x, $y);
	// }


	static function setting_to_def() {
		GLOBAL $Ui_thread, $setting, $OP, $INFO;

		// проверка что поток не запущен
		if($Ui_thread->check_run_dialog())
			return false;

		if(!($INFO['step'] == CREATE_BLOCKS and empty($INFO['recovery_fname']))) {
			messageDlg("Сбросить настройки можно только на этапе 'Запись файлов' до начала его обработки. Нажмите кнопку 'Обнулить этап' если вы и так на этапе 'Запись файлов'", mtWarning, MB_OK);
			return true;
		}

		$info_backup = $INFO;
		$setting->load('def');
		$INFO = $info_backup;
	}

	// вывод отладочной информации в файл
	static function debug_values() {
		GLOBAL $Ui_thread, $log, $OP, $INFO, $Ui_steps_story, $Bt_run, $setting, $Graphs;
		
		$str = '<?';

		$str .= "\r\n//=====Все определеленные переменные===\r\n";
		$str .= print_r(get_defined_vars(), true);

		$str .= "\r\n//=== Глобальные переменные ===\r\n";
		$global_vars = array('Ui_thread', 'log', 'OP', 'INFO', 'Bt_run', 'setting', 'Frags_graph', 'Ui_steps_block');
		foreach($global_vars as $var_name) {
			$str .= "\r\n// =переменная $var_name = \r\n";
			$str .= print_r($$var_name, true);
		}

		file_put_contents('trace_' . date("Y-m-d_H-i-s") . '.php', $str);
	}
}

?>