<?php
//phpinfo();exit;


$debug_mode = (isset($_GET['debug'])) ? $_GET['debug'] : '';
$is_cron = (isset($_GET['cron'])) ? $_GET['cron'] : '';

include 'lib/simplehtml/simple_html_dom.php';
$html = new simple_html_dom();

// Анализ уведомлений из профиля
$is_notices_analysis = (isset($_GET['notices'])) ? true : false;

$our_books_name = [
	'После развода. Такое не прощают',
	/*'Измена. Я выбираю (не) тебя',
	'С боссом по ошибке',
	'Подарок для чужого босса',
	'Измена. Украденная жизнь',
	//'Порочный договор'
	'Твоей (не) буду',
	'Измена. Украденная жизнь',
	'Развод. Новое начало',*/
];

if ($is_notices_analysis) {
	getNoticesAnalysis();
}


//include 'lib/simplehtml/simple_html_dom.php';


/*if ($is_debug) {
	?><pre><?
	var_dump($_SERVER, $_REQUEST, $_COOKIE);
	?></pre><?
	exit;
}*/
//phpinfo();exit; 
// Данные для подключения к базе данных
$host = 'localhost';
$db = 'j17841223';
$user = 'j17841223';
$pass = '4QPuu2z7k';
$charset = 'utf8mb4';
//$days = 2;

$headers = [
  'http'=>[
	'header'=>'sec-ch-ua: "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"' . "\r\n" .
			  "sec-ch-ua-mobile: ?1\r\n" .
			  'sec-ch-ua-platform: "Android"' . "\r\n" .
			  "User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36\r\n"
			  //"Cookie: theme=e72dfa4e2a004bac573dd7f4e5ca71499cd42cfb97e928ead166e8059610de99a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22theme%22%3Bi%3A1%3Bs%3A9%3A%22mobile_v2%22%3B%7D\r\n" .
			  //"Cookie: isCookies=1"
  ]
];
//$context = stream_context_create($headers);

$mode_authors = 'off';
$mode_authors_range = '1-27'; // 1-25

// Максимальное кол-во страниц на одну тему
$tag_page_max = 10;

//$start_url;
$start_url = 'https://' . 'litnet.com';

if ($debug_mode == 'headers_loging') $start_url = 'http://' . '6077ad09b233.hosting.myjino.ru';

$our_books_url = [];

$is_without_ours_book = (isset($_GET['ours-off'])) ? true : false;

$is_author_detail = (isset($_GET['regs'])) ? true : false;

//if (!$is_cron && !$is_without_ours_book) {
$our_books_url = [
	'/ru/book/posle-razvoda-takoe-ne-proshchayut-b541447',
	/*'/ru/book/izmena-ya-vybirayu-ne-tebya-b480481',
	'/ru/book/s-bossom-po-oshibke-b481644',
	'/ru/book/podarok-dlya-chuzhogo-bossa-b485078',
	'/ru/book/izmena-ukradennaya-zhizn-b489073',
	'/ru/book/tvoei-ne-budu-b494988',
	//'/ru/book/porochnyi-dogovor-b489540'
	'/ru/book/razvod-novoe-nachalo-b507757',*/
];


if ($is_cron || $is_without_ours_book) {
	$our_books_url = [];	
}
//}

if ($debug_mode == 'headers_loging') {
	$our_books_url = [
		'/test.php',
	];
}

$is_with_recommended = (isset($_GET['recom'])) ? true : false;

$cats_without_widgets = [
	'/ru/best-off/romanticheskaya-erotika',
];

$js_author_name = 'Лена Грин';

//$is_author_detail = true;
//$is_with_recommended = false;
$is_save_books = true;
$is_only_cas = 0;


#############
$is_skip_finished = (isset($_GET['full'])) ? false : true;
$is_author_books = (isset($_GET['author-books'])) ? true : false;
$is_search_in_widgets = (isset($_GET['in-widgets'])) ? true : false;
$is_search_in_blogs = (isset($_GET['in-blogs'])) ? true : false;
$is_search_in_tags = (isset($_GET['in-tags'])) ? true : false;
$mode_search_tags = (isset($_GET['mode-tags'])) ? $_GET['mode-tags'] : 'top'; // top, pop-day, pop-month, pop-year
$is_vews_per = (isset($_GET['views-per'])) ? true : false;
$is_with_pics = (isset($_GET['pics'])) ? true : false;

$books_get = (isset($_GET['books'])) ? $_GET['books'] : '';
$widget_get = (isset($_GET['widget'])) ? $_GET['widget'] : '';

$rank_widget = (isset($_GET['rank'])) ? $_GET['rank'] : '';

if ($books_get) $mode = 'books';
else if ($widget_get) $mode = 'widget';
else $mode = 'books';

$days = (isset($_GET['days'])) ? $_GET['days'] : 1;
$hours = (isset($_GET['hours'])) ? $_GET['hours'] : 1;

$period = (isset($_GET['period'])) ? $_GET['period'] : 'day';

$is_mobile = (isset($_GET['mob'])) ? true : false;

$cat_get = (isset($_GET['genres'])) ? $_GET['genres'] : '';


$blogs_pages_num = 10;
###############

// центральные на главной
if ($widget_get == 'new') $widget_name_conf = 'Обновления книг';  
else if ($widget_get == 'hot') $widget_name_conf = 'Горячие новинки';
else if ($widget_get == 'top') $widget_name_conf = 'ТОП в разных жанрах';
else if ($widget_get == 'audio') $widget_name_conf = 'Популярные книги с аудио';
else if ($widget_get == 'best') $widget_name_conf = 'Бестселлеры';
// правый слайдер на главной
else if ($widget_get == 'pop') $widget_name_conf = 'Набирают популярность';
else if ($widget_get == 'sale') $widget_name_conf = 'Сегодняшние скидки';
else if ($widget_get == 'recom') $widget_name_conf = 'Литнет рекомендует';
// все на главной (для cas)
else if ($widget_get == 'all') $widget_name_conf = 'all';
else $widget_name_conf = 'all';

$widget_names_cats = [
	'top-lyubovnye-romany' => 'ТОП "Любовные романы"',
	'hot-lyubovnye-romany' => 'Горячие новинки "Любовные романы"',
	'pop-lyubovnye-romany' => 'Набирают популярность "Любовные романы"',
	'new-lyubovnye-romany' => 'Обновления "Любовные романы"',
	
	'top-korotkiy-lyubovnyy-roman' => 'ТОП "Короткий любовный роман"',
	'hot-korotkiy-lyubovnyy-roman' => 'Горячие новинки "Короткий любовный роман"',
	'pop-korotkiy-lyubovnyy-roman' => 'Набирают популярность "Короткий любовный роман"',
	'new-korotkiy-lyubovnyy-roman' => 'Обновления "Короткий любовный роман"',
	
	'top-sovremennyy-lyubovnyy-roman' => 'ТОП "Современный любовный роман"',
	'hot-sovremennyy-lyubovnyy-roman' => 'Горячие новинки "Современный любовный роман"',
	'pop-sovremennyy-lyubovnyy-roman' => 'Набирают популярность "Современный любовный роман"',
	'new-sovremennyy-lyubovnyy-roman' => 'Обновления "Современный любовный роман"',
	
	'top-sluzhebnyj-roman' => 'ТОП "Служебный роман"',
	'hot-sluzhebnyj-roman' => 'Горячие новинки "Служебный роман"',
	'pop-sluzhebnyj-roman' => 'Набирают популярность "Служебный роман"',
	'new-sluzhebnyj-roman' => 'Обновления "Служебный роман"',	

	'top-proza' => 'ТОП "Проза"',
	'hot-proza' => 'Горячие новинки "Проза"',
	'pop-proza' => 'Набирают популярность "Проза"',
	'new-proza' => 'Обновления "Проза"',

	'top-jenskaya-proza' => 'ТОП "Женский роман"',
	'hot-jenskaya-proza' => 'Горячие новинки "Женский роман"',
	'pop-jenskaya-proza' => 'Набирают популярность "Женский роман"',
	'new-jenskaya-proza' => 'Обновления "Женский роман"',
	
	'top-sovremennaya-proza' => 'ТОП "Современная проза"',	
	'hot-sovremennaya-proza' => 'Горячие новинки "Современная проза"',
	'pop-sovremennaya-proza' => 'Набирают популярность "Современная проза"',
	'new-sovremennaya-proza' => 'Обновления "Современная проза"',
	
	'top-raznoe' => 'ТОП "Разное"',	
	'hot-raznoe' => 'Горячие новинки "Разное"',
	'pop-raznoe' => 'Набирают популярность "Разное"',
	'new-raznoe' => 'Обновления "Разное"',
	
	'top-drama' => 'ТОП "Драма"',	
	'hot-drama' => 'Горячие новинки "Драма"',
	'pop-drama' => 'Набирают популярность "Драма"',
	'new-drama' => 'Обновления "Драма"',
];

$books_gets = [];
if ($mode == 'books') {
	//$books_get = (isset($_GET['books'])) ? $_GET['books'] : '';
	if ($books_get) {
		$books_gets = explode(',', $books_get);

		foreach ($books_gets as &$books_get) {
			$books_get = '/ru/book/' . $books_get;
		}
	}
}


$mode_authors_ranges = explode('-', $mode_authors_range);

$month_rus = [
	'01'=>'Янв',
	'02'=>'Фев',
	'03'=>'Мар',
	'04'=>'Апр',
	'05'=>'Мая',
	'06'=>'Июн',
	'07'=>'Июл',
	'08'=>'Авг',
	'09'=>'Сен',
	'10'=>'Окт',
	'11'=>'Ноя',
	'12'=>'Дек', 
];

$cas_authors = file('data/cas_authors.txt');
$cas_authors = preg_replace('/^\s*|\s*$/', '', $cas_authors);



$books_url = [];

if ($mode == 'widget') {
	if ($is_mobile) {
		$context = stream_context_create($headers);
		
		// для витрин жанров
		$widgets_urls = [];
		if ($cat_get) {
			$cats_get = explode(',', $cat_get);
			//if (count($cats_get))
			if (count($cats_get)) {
				foreach ($cats_get as $cats_get_elem) {
					$widgets_urls[] = $start_url . '/ru/best-off/' . $cats_get_elem;
				}
			}
			//$widgets_urls = $start_url . '/ru/best-off/' . $cat_get;
		}
		else {
			$widgets_urls[] = $start_url;
		}
		
		//var_dump($widgets_urls, __LINE__);exit;
		foreach ($widgets_urls as $genre_num=>$widgets_url) {
			/*$context .= "Referer: $widgets_url\r\n";
			var_dump($context);exit;*/
			$html->load_file($widgets_url, false, $context);
			
			/*if (trim($html->find('title', 0)->plaintext))
				echo $html->innertext;
			exit;*/
			
			//echo "<pre>Тайтл главной мобильной: ".$html->find('title', 0)->plaintext."\n</pre>";
			if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
				echo "<pre>Тайтл главной мобильной: ".$html->find('title', 0)->plaintext."\n</pre>";
				$meta = $html->find('meta[name="HandheldFriendly"]', 0);
				echo "<pre>Мобильная версия: ".$meta->content."\n</pre>";
			}//exit;
			
			$widgets_cats = $html->find('.widget-slider');
			//var_dump(count($widgets_cats), __LINE__);//exit;
			
			if (!count($widgets_cats)) echo "todo:разобраться с этой сраной эротикой\n";
			/*
			todo:разобраться с этой сраной эротикой
			$is_top = false;
			if (!count($widgets_cats)) {
				$first_book_top = $html->find('.js-book-item', 0);
				$first_book_top_url = $first_book_top->find('.bookCard-linkBlock', 0)->href;
				$html->load_file($start_url . $first_book_top_url, false, $context);
				//echo $html->innertext;exit('422');
				$widgets_cats = $html->find('.widget-slider');
				$is_top = true;
			}*/
			
			//var_dump(count($widgets_cats), __LINE__);exit;
			
			// на главной
			foreach($widgets_cats as $iter=>$widget) {
				//echo $iter;exit;//$html->find('a[href="#bp-slider1"]', 0)->plaintext;exit;
				//echo $widget->innertext;continue;
				$widget_data = [];
				
				/*
				todo:разобраться с этой сраной эротикой
				if ($is_top) {
					if ($iter == 0) $widget_name = $html->find('a[href="#bp-slider1"]', 0)->plaintext;
					else if ($iter == 1) $widget_name = $html->find('a[href="#bp-slider2"]', 0)->plaintext;
				}
				else {
					$widget_name = $widget->find('.widget-title', 0)->plaintext;
				}*/
				
				$widget_name = $widget->find('.widget-title', 0)->plaintext;
				
				$widget_data['widget_name'] = trim($widget_name);
				
				//echo "<pre>Найден виджет: ".$widget_data['widget_name']."\n</pre>";
				if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
					echo "<pre>Найден виджет: ".$widget_data['widget_name']."\n</pre>";
				}//exit;
				
				//var_dump($widget_data['widget_name'], __LINE__);exit;
				
				//if (!$rank_widget) {
					if ($cat_get) {
						if (($widget_names_cats[$widget_get .'-'. $cats_get[$genre_num]] != $widget_name) && $widget_name_conf != 'all') continue;
						/*foreach ($widget_names_cats as $key=>$widget_names_cat) {
							$widget_cat = $widget_get .'-'. $cat_get;
							if ($widget_cat != $key) continue
						}*/
					}
					else {
						if ($widget_name != $widget_name_conf && $widget_name_conf != 'all') continue;
					}
				//}
				
				//var_dump($widget_name, __LINE__);//exit;
				
				if ($debug_mode == 'widget_main' || $debug_mode == 'books') echo "<pre>Выбранный виджет: $widget_name\n</pre>";
				//echo $widget_data['widget_name'];continue;
				// проверяем наличие книги в текущем виджете
				//$book_link_count = count($widget->find('.bookCard-title a'));
				
				foreach ($widget->find('.bookCard-content') as $rank=>$book_cont) {
					// если указано место в виджете
					if ($rank_widget && ($rank + 1) != $rank_widget) continue;
					$book_url = $book_cont->find('.bookCard-title a', 0)->href;
					$book_author_name = trim($book_cont->find('.bookCard-author', 0)->plaintext);
					
					if ($debug_mode == 'widget_main' || $debug_mode == 'books') echo "<pre>Ссылка на книгу и авторы: $book_url, $book_author_name\n</pre>";//exit;

					//var_dump($book_author_name, $book_url, $widget_name);continue;
					//if (!$book_author_name) { echo $book_url; exit; }
					//var_dump($book_author_name);
					$book_author_names = explode(', ', $book_author_name);			
					// отфильтровываем только cas-овцев, если включено
					if ($is_only_cas) {
						if (in_array($book_author_names[0], $cas_authors) || count($book_author_names) > 1 && in_array($book_author_names[1], $cas_authors)) {
							//var_dump($book_author_names, $book_url);continue;//exit;
							$books_url[] = $book_url;
							//continue;
						}
					}
					else {
					//else 
					//var_dump($book_author_name, $book_url);exit; 
						$books_url[] = $book_url;
					}
					
					//}
				}
				
				//print_r($books_url);exit('230');
				
				if ($debug_mode == 'widget_main') {
					echo "<pre>Все собранные ссылки (с фильтрацией):\n";
					print_r($books_url);
					echo "</pre>\n";///exit;
				}			

			
			}//var_dump($books_url);exit('172');
		}
	}	
	else {
		$html->load_file($start_url);

		//echo $html->plaintext;

		// на главной
		$widgets = $html->find('div.widget-block, div.recommended');
		
		//print_r(count($widgets));exit;
		// в слайдере на главной
		//$widgets_sl = $html->find('div.widget-block');

		// ищем запрошенный виджет
		foreach($widgets as $widget) {
			$widget_name = $widget->find('span.widget-heading, span.block-heading', 0)->plaintext;
			$widget_name = trim($widget_name);
			
			if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
				echo "<pre>Найденный виджет: $widget_name\n</pre>";
			}

			
			//var_dump($widget_name);
			// обрабатываем один или все виджеты
			if ($widget_name != $widget_name_conf && $widget_name_conf != 'all') continue;
			//else ($widget_type == 'top' && $widget_name != 'ТОП в разных жанрах') continue;
			
			if ($debug_mode == 'widget_main' || $debug_mode == 'books') echo "<pre>Выбранный виджет: $widget_name\n</pre>";
			//else {
			// собираем ссылки в соотв. виджете
			foreach ($widget->find('.bw-book-card, .bl-item') as $book_cont) {
				$book_url = $book_cont->find('a.bw-title, a.bl-title', 0)->href;
				$book_author_name = trim($book_cont->find('.bw-author, .bl-author', 0)->plaintext);
				
				if ($debug_mode == 'widget_main' || $debug_mode == 'books') echo "<pre>Ссылка на книгу и авторы: $book_url, $book_author_name\n</pre>";

				//var_dump($book_author_name, $book_url, $widget_name);continue;
				//if (!$book_author_name) { echo $book_url; exit; }
				//var_dump($book_author_name);
				$book_author_names = explode(', ', $book_author_name);			
				// отфильтровываем только cas-овцев, если включено
				if ($is_only_cas) {
					if (in_array($book_author_names[0], $cas_authors) || count($book_author_names) > 1 && in_array($book_author_names[1], $cas_authors)) {
						//var_dump($book_author_names, $book_url);continue;//exit;
						$books_url[] = $book_url;
						//continue;
					}
				}
				else {
				//else 
				//var_dump($book_author_name, $book_url);exit; 
					$books_url[] = $book_url;
				}
				
				//}
			}
			
			if ($debug_mode == 'widget_main') {
				echo "<pre>Все собранные ссылки (с фильтрацией):\n";
				print_r($books_url);
				echo "</pre>\n";
			}

			
		}//var_dump($books_url);exit('172');
	}
}
else {
	$books_url = $books_gets;
}

//if ($is_debug) { echo 'exit: '.__LINE__, exit; }

sort($books_url);
$books_url = array_merge($our_books_url, $books_url);
$books_url = array_unique($books_url);
$books_url = array_values($books_url);
//var_dump($books_url);exit;

$books_recomm_url = [];
if ($is_with_recommended) {
	$books_recomm_url = getBooks($books_url, 'recommended');
}


$books_all_url = array_merge($books_url, $books_recomm_url);

if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
			echo "<pre>Все собранные ссылки с нашими (и рекомендованными) книгами:\n";
			print_r($books_all_url);
			echo "</pre>\n";exit;
}
//var_dump($books_all_url, __LINE__);exit;

$books = getBooks($books_all_url);

//var_dump($books[0]['genres']);
//exit('176');

// сохраняем книги в БД, если указано в запросе
if ($is_save_books) {
	$saved_books = saveBooks($books);
}

if ($is_cron) exit('Cron OK!');

include('templates/header.php');

/*if ($period) {
	include('templates/book_period.php');
}
else {
	*/
	
//var_dump($books);
//exit('483');

	
include('templates/main.php');
//}

include('templates/footer.php');  






// все ссылки на книги из выбранного виджета или прямые
function getBooks ($books_url, $mode_func = '') {
	
	global $mode_authors, $mode_authors_range, $start_url, $our_books_url, $is_skip_finished, $is_author_detail, $is_with_recommended,
	$js_author_name, $mode, $widget_name_conf, $mode_authors_ranges, $month_rus, $html, $cas_authors, $host, $db, $user, $pass, $charset, $days, $hours, $debug_mode, $context, $headers, $is_search_in_widgets, $is_search_in_blogs, $is_search_in_tags, $is_with_pics;

	$books = [];
	foreach($books_url as $book_num=>$book_url) {
	
		// заходим на страницу каждой книги виджета или указанных
		$html->load_file($start_url . $book_url);
		
		// первый режим работы функции - формирование массива с данными о книгах
		if (!$mode_func) {
			
			if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
			echo "<pre>Тайтл страницы книги: ".$html->find('title', 0)->plaintext."\n";
			//print_r($books_all_url);
			echo "</pre>\n";
			}
			
		
			$book_data = [];
			$book_data['url'] = $start_url . $book_url;
			preg_match('|([^/]+)$|', $book_data['url'], $matches);
			$book_data['book_id'] = $matches[1];			
			//var_dump($book_data['book_id'],'###'); 
			//$book_id = 'izmena-ya-vybirayu-ne-tebya-b480481';
			// получаем последние данные по книге
			$book_data['last_data'] = getBookLastData($book_data['book_id']);
			
			//var_dump($book_data['last_data']);exit('493');
			
			$book_data['name'] = trim($html->find('h1', 0)->plaintext);
			$book_coll_1 = $html->find('div.book-view-info-coll', 0);
			
			//var_dump($book_coll_1);exit;
			
			// ищем контейнер с темами
			foreach ($book_coll_1->find('p') as $genres_cont) {
				$genres_label = trim($genres_cont->find('span.meta-name', 0)->plaintext);
				if ($genres_label != 'В тексте есть:') continue;
				$genres = [];
				$genres_ranks = [];
				// все темы
				foreach ($genres_cont->find('a') as $i=>$genre_link) {
					$genre_data['url'] = $start_url . $genre_link->href;
					$genre_data['name'] = trim($genre_link->plaintext);
					$genre_name = $genre_data['name'];
					//var_dump($genre_data['name'],__LINE__);
					// получаем место в топе темы, если включен проход по ее страницам
					$genre_data['rank'] = [];
					$genre_rank = '';
					if ($is_search_in_tags) {
						$genre_data['rank'] = getTagRank($genre_data['url'], $book_data['url']);
						$genre_data['last_data'] = getBookLastData($book_data['book_id'], true);
						//var_dump($genre_data['rank'], $genre_data['last_data'], __LINE__);exit;
						if (!$genre_data['rank'][3]) {
							$genre_rank_total = 1;
							//$genre_rank = " (0/" . ($genre_data['rank'][3] * 20) . ')';
						}
						else {
							$genre_rank_total = $genre_data['rank'][3];
						}
						
						$tag_rank_last = isset($genre_data['last_data']['top_tag_' . ($i + 1)]) ? (int)$genre_data['last_data']['top_tag_' . ($i + 1)] : 0;
						$genre_rank_num = (int)$genre_rank_num;
						//var_dump($genre_rank_num);
						$genres_ranks[] = $genre_rank_num;
						$diff_tag_rank = $genre_rank_num - $tag_rank_last;
						
						if (!$genre_data['rank'][0]) {
							$genre_rank_num = 0;
							$genre_rank = " (0/" . ($genre_rank_total * 20) . ')';
						}
						else {
							$genre_rank_num = ($genre_data['rank'][1] - 1) * 20 + $genre_data['rank'][0];
							//var_dump($genre_rank_num,__LINE__);
							$genre_rank = ' (' . $genre_rank_num . "/" . ($genre_rank_total * 20) .')';
						}
						//var_dump($genre_data['name'],__LINE__);
						//var_dump($genre_rank_num, $tag_rank_last, $diff_tag_rank, __LINE__);exit;
						
						if ($diff_tag_rank == $genre_rank_num || !$diff_tag_rank) {
							$genres[] = '<a href="' . $genre_data['url'] . '">' . $genre_name . $genre_rank . '</a>';
						}
						else if ($diff_tag_rank < 0) {
							$genres[] = '<a style="color:#32CD32" href="' . $genre_data['url'] . '">' . $genre_name . $genre_rank . '</a>';
						}
						else if ($diff_tag_rank > 0) {
							$genres[] = '<a style="color:red" href="' . $genre_data['url'] . '">' . $genre_name . $genre_rank . '</a>';
						}
					}
					else {
						$genres[] = '<a href="' . $genre_data['url'] . '">' . $genre_name . $genre_rank . '</a>';
					}

					//$book_data['genres'][] = $genre_data;
					//$genres_name[] = trim($genre_url->plaintext)			
				}
				$book_data['genres'] = $genres;
				$book_data['genres_ranks'] = $genres_ranks;
				//var_dump($book_data['genres'], __LINE__);exit;
				//$book_data['genres'] = trim(str_replace('В тексте есть:', '', trim($genres_cont->plaintext)));
				break;
			}
			//var_dump($book_data['genres']);exit('512');
			/*$genres_name = [];
			foreach ($genres_cont->find('a') as $genre_url) {
				$genres_name[] = trim($genre_url->plaintext);
			}*/
			//$book_data['genres'] = $genres_name;
			$book_coll_2 = $html->find('div.book-view-info-coll', 1);
			
			/*if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
				echo "<pre>Все данные по книге до обработки жанров:\n";
				print_r($book_data);
				echo "</pre>\n";
			}*/

			
			// жанры 
			foreach ($book_coll_2->find('p') as $categories_cont) {
				$categories_label = trim($categories_cont->find('span.meta-name', 0)->plaintext);
				if ($categories_label == 'Текущий рейтинг:') {
					//var_dump($categories_label,__LINE__);
					$categories = [];
					// все жанры
					foreach ($categories_cont->find('a') as $i=>$category_link) {
						$rank_text = $category_link->parent()->plaintext;
						//var_dump($rank_text);//exit;
						preg_match_all('/#(\d+)\s+в\s+([^#]+)/', $rank_text, $matches, PREG_SET_ORDER);
						if (!count($matches)) continue;
						$ratings = [];
						foreach ($matches as $match) {
							$ratings[] = [
								'rank' => $match[1],
								//'category' => trim($match[2])
							];
						}
						//var_dump($ratings);exit;
						$category_data['rank'] = $ratings[$i]['rank'];
						$category_data['url'] = $start_url . $category_link->href;
						$category_data['name'] = trim($category_link->plaintext);
						
						//var_dump('top_genre_' . ($i + 1), __LINE__);exit;
						$category_rank_last = isset($book_data['last_data']['top_genre_' . ($i + 1)]) ? (int)$book_data['last_data']['top_genre_' . ($i + 1)] : 0;
						$category_data['rank'] = (int)$category_data['rank'];
						$diff_category_rank = $category_data['rank'] - $category_rank_last;
						//var_dump($diff_category_rank, $category_data['rank'], $category_rank_last);
						
						if ($diff_category_rank == $category_data || !$diff_category_rank)
							$category_data['link'] = "<a href=\"$category_data[url]\">$category_data[name] ($category_data[rank])</a>";
						else if ($diff_category_rank < 0)
							$category_data['link'] = "<a style=\"color:#32CD32\" href=\"$category_data[url]\">$category_data[name] ($category_data[rank], +".abs($diff_category_rank).")</a>";
						else if ($diff_category_rank > 0)		
							$category_data['link'] = "<a style=\"color:red\" href=\"$category_data[url]\">$category_data[name] ($category_data[rank], -$diff_category_rank)</a>";
						
						//$category_data['link'] = "<a href=\"$category_data[url]\">$category_data[name] ($category_data[rank])</a>";
						$categories[] = $category_data;
						//$categories[] = $category_data['link'];
						//$book_data['categories'][] = $category_data;
						//$categories_name[] = trim($category_url->plaintext)			
					}
				}
				$book_data['categories'] = $categories;
				//$book_data['categorys'] = trim(str_replace('В тексте есть:', '', trim($categorys_cont->plaintext)));
				break;
			}
			//exit('599');
			if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
				echo "<pre>Все данные по книге после обработки жанров:\n";
				print_r($book_data);
				echo "</pre>\n";
			}

			
			//var_dump($book_data['categories']);exit;
			$book_data['categories_html'] = [];
			foreach ($book_data['categories'] as $category) {
				$book_data['categories_html'][] = $category['link'];
			}
			//var_dump($book_data);exit('561');

			
			//var_dump($categories);exit;
			$pub_cont_2 = $book_coll_2->find('p', 1);
			$pub_date = trim($pub_cont_2->find('span.meta-name + span', 0)->plaintext);
			preg_match('/^(\d{2}\.\d{2}\.\d{4})\s*—\s*(.*)$/', $pub_date, $match);
			$book_data['pub_date'] = trim($match[1]);
			$book_data['proc_date'] = trim($match[2]);
			
			// флаг законченной книги
			$book_data['is_completed'] = false;
			if ($book_data['proc_date'] != '...') $book_data['is_completed'] = true;
			// пропускаем законченные если указано
			if ($is_skip_finished && $book_data['is_completed']) continue;
			// для книг в процессе берем текущий год
			if ($match[2] == '...') {
				$status = trim($html->find('span.book-status', 0)->plaintext);
				$status = trim(str_replace('&#xe86a;', '', $status));
				preg_match('/:\s+(.*?)\s+(.*?)\s+/', $status, $match_proc_date);
				//preg_match('/\.(\d{4})/', $book_data['pub_date'], $match_pub_year);
				$book_data['proc_date'] = $match_proc_date[1] . '.' . array_search($match_proc_date[2], $month_rus) . '.' . date('Y');
			}
			$proc_period = strtotime($book_data['proc_date']) - strtotime($book_data['pub_date']);						//var_dump($book_data['proc_period'],'###');
			//$proc_period = ($proc_period == 0) ? 1 : $proc_period;
			$proc_period_now = time() - strtotime($book_data['pub_date']);
			$proc_period_now = round($proc_period_now / (60 * 60 * 24), 4);
			$book_data['proc_period'] = $proc_period / (60 * 60 * 24);
			$book_data['proc_period'] = ($book_data['proc_period'] == 0) ? 1 : $book_data['proc_period'];
			$chars = trim($html->find('span.book-status', 0)->title);
			$book_data['chars'] = (int) str_replace(' ', '', $chars);
			$book_data['chars_day'] = round($book_data['chars'] / $book_data['proc_period']);
			//var_dump($book_data['chars'],$book_data['proc_period'],$book_data['chars_day'],'###');
			$book_data['views'] = trim($html->find('span.count-views', 0)->plaintext);
			$book_data['chapters'] = count($html->find('select[name="chapter"] option[value!=""]'));
			$book_data['views_day'] = round($book_data['views'] / $proc_period_now, 1);			

			/*$book_data['last_data'] = $last_data[subscribes];
			$book_data['chars'] = 
			$book_data['views'] = 
			$book_data['rating'] = 
			$book_data['stars'] = 
			$book_data['favorites'] = 
			$book_data['comments'] = */
			$book_data['views_last_days'] = getBookViewLastRange($days, 'days', $book_data['book_id']);
			$book_data['views_last_hours'] = getBookViewLastRange($hours, 'hours', $book_data['book_id']);

			$book_data['rating'] = trim($html->find('span.book-rating-info-value span', 0)->plaintext);
			$book_data['views_rating'] = ($book_data['rating']) ? round($book_data['views'] / $book_data['rating'], 1) : 0;
			$book_data['rating_day'] = round($book_data['rating'] / $proc_period_now, 2);
			$book_data['stars'] = trim($html->find('.rate-btn-like span', 0)->plaintext);
			/*$book_data['likes'] = trim($html->find('div.book-rating-buttons span', 0)->plaintext);
			$book_data['likes_day'] = round($book_data['likes'] / $proc_period_now, 1);*/
			$book_data['favorites'] = trim($html->find('span.count-favourites', 0)->plaintext);
			$book_data['views_favorites'] = round($book_data['views'] / $book_data['favorites'], 1);
			$book_data['favorites_day'] = round($book_data['favorites'] / $proc_period_now, 1);
			$comments = ($html->find('h3.comments-head-title', 0)) ? (int)trim($html->find('h3.comments-head-title', 0)->plaintext) : 0;			
			$book_data['comments'] = (int) str_replace(' ', '', $comments);
			$book_data['views_comments'] = ($book_data['comments']) ? round($book_data['views'] / $book_data['comments'], 1) : 0;
			$book_data['comments_day'] = round($book_data['comments'] / $proc_period_now, 2);
			// todo
			
			//echo($html->find('.book-view-cover img', 0)->src);
			//exit;
			$book_data['img'] = '';
			if ($is_with_pics) {
				$img_src = $html->find('.book-view-cover img', 0)->src;
				preg_match('/([^\/]+)\.([^\/.]+)$/', $img_src, $match);
				$img_filename_base = $match[1];
				$img_filename_ext = $match[2];
				$img_filename = 'images/' . md5($img_src) . ".$img_filename_ext";
				
				if (!file_exists($img_filename)) {
					// Загружаем изображение с удаленного сервера
					$img_data = file_get_contents($img_src);

					// Проверяем, успешно ли загрузилось изображение
					if ($img_data === FALSE) {
						echo "Ошибка загрузки изображения\n";
					}

					// Сохраняем изображение локально
					file_put_contents($img_filename, $img_data);
				}
			
				$book_data['img'] = $img_filename;
			}

			
			/*$book_data['annotation'] = preg_replace('/ {2,}/', ' ', trim($html->find('#annotation', 0)->plaintext));
			$book_data['annotation'] = str_ireplace(["<br />","<br>","<br/>"], "\r\n", $book_data['annotation']);*/
			/*$book_data['name'] = trim($html->find('h1', 0)->plaintext);
			$book_name = trim($html->find('h1', 0)->plaintext);*/
			
			//$book_data
			
			$book_data['authors'] = [];
			foreach ($book_coll_1->find('a.author') as $author_link) {
				$authors_book = [];
				$authors_book['url'] = $start_url . $author_link->href;
				$authors_book['name'] = trim($author_link->plaintext);
				// проверяем автора на CAS
				$style = 'style=""';
				if (in_array($authors_book['name'], $cas_authors)) {
					$style = 'style="color:red"';					
				}
				$authors_book['link'] = "<a href=\"$authors_book[url]\" $style>$authors_book[name]</a>";
				$book_data['authors'][] = $authors_book;
			}
			
			
			/* if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
				echo "<pre>Все данные по книге до захода на стр. автора:\n";
				print_r($book_data);
				echo "</pre>\n";
			}*/

			
				
			// все авторы
			if (($mode_authors == 'on' && ($book_num >= $mode_authors_ranges[0] - 1 && $book_num <= $mode_authors_ranges[1] - 1)) || $mode == 'books') {
				$book_data = getAdditionalAuthorData($book_data);
			}
			
			// ищем книги в виджетах жанров
			//var_dump($book_data['categories'], __LINE__);
			if ($is_search_in_widgets) {
				$in_widgets_modes = [
					'mob_cats',
					'mob_main',
					'pc_cats',
					'pc_main',
				];
				$books_in_widgets = [];
				foreach ($in_widgets_modes as $in_widgets_mode) {
					$books_in_widgets[$in_widgets_mode] = checkInWidgets($book_data, $in_widgets_mode);					
				}
				//var_dump($book_data,__LINE__);exit;
				//$book_data = checkInWidgets($book_data, null, 'main');
				//var_dump($book_data,__LINE__);exit;
				$book_data['in_widgets'] = $books_in_widgets;
			}
			
			if ($is_search_in_blogs) {
				$book_data['in_blogs'] = checkInBlogs($book_data);
			}
			
			// Получаем данные с последнего попадания в виджет "Обновления"
			$data_last_update = [];
			$data_last_update = getDataFromLastWidgetsUpdate($book_data['book_id']);
			if (is_array($data_last_update)) {
				$chars_before_update = 20000 - ($book_data['chars'] - $data_last_update['chars']);
				if ($chars_before_update < 0) $chars_before_update = 0;
				$book_data['chars_before_update'] = $chars_before_update;				
			}
			else {
				$book_data['chars_before_update'] = $data_last_update;
			}
			///var_dump($book_data['chars_before_update']);exit;
			
			//exit('544');
			//var_dump($book_data['in_widgets'], __LINE__);exit;
			//exit('477');
			//var_dump($book_data['in_widgets']);//exit('331');
			//print_r($book_data['in_widgets']);exit;
			//exit('331');
			//var_dump($book_data);exit('442');
			
			if ($debug_mode == 'widget_main' || $debug_mode == 'books') {
				echo "<pre>Все собранные данные по книге:\n";
				print_r($book_data);
				echo "</pre>\n";
			}

			//var_dump($book_data, __LINE__);//exit;
			
			
			$books[] = $book_data;
		}
		
		
		// если книги наши и включено "с рекомендованными"
		else if ($is_with_recommended && $mode_func == 'recommended') {
			
			// создаем новый объект именно для рекомендованных
			$html_recom = new simple_html_dom();
			
			foreach ($html->find('.recommended .block-heading') as $recom_block_heading) {
				$recom_heading = trim($recom_block_heading->plaintext);
				if ($recom_heading == 'С этой книгой читают') {
					$recomm_block = $recom_block_heading->next_sibling();
					$recomm_books_url = [];
					foreach ($recomm_block->find('div:eq(0) a.bl-title') as $recom_book_link) {
						$recomm_books_url[] = $recom_book_link->href;
					}
					return $recomm_books_url;
				}
			}
		}
		//exit('514');
		// если книги наши и включено "с рекомендованными"
		//if 
		
		//if (!$is_recursive) getBooks($books_url[0]);
		
	}
	
	//exit('465');
	
	return $books;
}


function getBookLastData($book_id, $is_not_empty_tag_ranks = false) {
	global $host, $db, $user, $pass, $charset, $is_debug;
    try {
        // Создаем подключение к базе данных
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $pdo = new PDO($dsn, $user, $pass);
        
        // Устанавливаем режим ошибок
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

		if ($is_not_empty_tag_ranks) 
			$sql = "SELECT * FROM dates WHERE book_id = :book_id
						AND top_tag_1 IS NOT NULL 
						AND top_tag_2 IS NOT NULL
						AND top_tag_3 IS NOT NULL
					ORDER BY date_time DESC LIMIT 1";
		else 
			$sql = "SELECT * FROM dates WHERE book_id = :book_id ORDER BY date_time DESC LIMIT 1";						
        // Подготавливаем и выполняем запрос
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':book_id', $book_id, PDO::PARAM_STR);
        $stmt->execute();       
        // Получаем результаты
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
		$last_data = (isset($results[0])) ? $results[0] : null;
		//$last_data = $results[0];
		//var_dump($last_data, __LINE__);exit;
		return $last_data;
        
    } catch (PDOException $e) {
        // Обработка ошибок подключения
        echo "Ошибка подключения к базе данных: " . $e->getMessage();
        return [];
    }
}



function getBookViewLastRange($range, $type, $book_id) {
	global $host, $db, $user, $pass, $charset, $is_debug;
    try {
        // Создаем подключение к базе данных
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $pdo = new PDO($dsn, $user, $pass);
        
        // Устанавливаем режим ошибок
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
       // Формируем SQL-запрос
		if ($type == 'days') {
			$interval_type = 'DAY';			
		}
		else if ($type == 'hours') {
			$interval_type = 'HOUR';
		}
		$sql = "SELECT (MAX(views) - MIN(views)) / $range AS views_diff FROM dates WHERE date_time >= NOW() - INTERVAL $range $interval_type AND book_id = :book_id";						
        // Подготавливаем и выполняем запрос
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':book_id', $book_id, PDO::PARAM_STR);
        $stmt->execute();       
        // Получаем результаты
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
		$views_diff = $results[0]['views_diff'];
		if (is_null($views_diff)) {
			$views_diff = 'н/д';
			return $views_diff;
		}
		else {
			return round($views_diff, 1);
		}
		//var_dump($results);        
        //return round($results[0]['views_diff'], 1);
        
    } catch (PDOException $e) {
        // Обработка ошибок подключения
        echo "Ошибка подключения к базе данных: " . $e->getMessage();
        return [];
    }
}

//$data = getBookViewLastThreeDays(1, $host, $db, $user, $pass, $charset);


function saveBooks($books) {
	
	global $host, $db, $user, $pass, $charset, $mode_authors, $mode, $is_debug;
	if ($is_debug) { var_dump($books); exit; }
	// Настройки для PDO
	$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
	$options = [
		PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
		PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
		PDO::ATTR_EMULATE_PREPARES   => false,
	];

	try {
		// Создание нового PDO подключения
		$pdo = new PDO($dsn, $user, $pass, $options);
	} catch (\PDOException $e) {
		// Обработка ошибок подключения
		throw new \PDOException($e->getMessage(), (int)$e->getCode());
	}

	// Пример массива данных
	/*$data = [
		['name' => 'John Doe', 'email' => 'john@example.com'],
		['name' => 'Jane Smith', 'email' => 'jane@example.com'],
		// добавьте больше данных по мере необходимости
	];*/
	$success_saving_count = 0;
	foreach ($books as $book_data) {
		//var_dump('saveBooks', __LINE__);
		// Подготовка SQL запроса
		/*if ($mode_authors == 'on' || $mode == 'books') {*/
			$sql = "INSERT INTO dates (date_time, book_id, subscribes, chars, views, chapters, rating, stars, favorites, comments, widgets, top_genre_1, top_genre_2, top_tag_1, top_tag_2, top_tag_3) 
						VALUES (:date_time, :book_id, :subscribes, :chars, :views, :chapters, :rating, :stars, :favorites, :comments, :widgets, :top_genre_1, :top_genre_2, :top_tag_1, :top_tag_2, :top_tag_3)";
			$stmt = $pdo->prepare($sql);
			$stmt->execute([
				':date_time' => date('Y.m.d H:i:s'),
				':book_id' => $book_data['book_id'],
				':subscribes' => isset($book_data['authors'][0]['subscribes']) ? $book_data['authors'][0]['subscribes'] : 0,
				':chars' => $book_data['chars'],
				':views' => $book_data['views'],
				':chapters' => $book_data['chapters'],
				':rating' => $book_data['rating'],
				':stars' => $book_data['stars'],
				':favorites' => $book_data['favorites'],
				':comments' => $book_data['comments'],
				':widgets' => isset($book_data['in_widgets']) ? serialize($book_data['in_widgets']) : '',
				':top_genre_1' => $book_data['categories'][0]['rank'],
				':top_genre_2' => isset($book_data['categories'][1]['rank']) ? $book_data['categories'][1]['rank'] : null,
				':top_tag_1' => isset($book_data['genres_ranks'][0]) ? $book_data['genres_ranks'][0] : null,
				':top_tag_2' => isset($book_data['genres_ranks'][1]) ? $book_data['genres_ranks'][1] : null,
				':top_tag_3' => isset($book_data['genres_ranks'][2]) ? $book_data['genres_ranks'][2] : null,
			]);
		//}
		$success_saving_count++;
	}
	return $success_saving_count;
	//echo "Данные успешно записаны! ($success_saving_count)";
}

function getAdditionalAuthorData ($book_data) {
	global $html, $debug_mode, $is_author_detail;
	$authors = [];
	foreach ($book_data['authors'] as $i=>&$author_data_book) {
		$author_data = [];
		$author_data['url'] = $author_data_book['url'];
		// заходим на страницу каждого автора
		$html->load_file($author_data['url']);
		//$author_data['name'] = trim($html->find('h1', 0)->plaintext);
		//$author_data['link'] = "<a href=\"$author_data[url]\">$author_data[name]</a>";
		$author_data['subscribes'] = trim($html->find('button.follow_btn span', 0)->plaintext);
		$author_data['books_num'] = count($html->find('.author-content .book-item'));
		$author_data['books_num_comm'] = count($html->find('.author-content .new-price-discount'));
		$author_data['books_num_proc'] = count($html->find('.author-content .book-status-process'));
		//
		// дата регистрации и кол-во подписок в день, если включено
		if ($is_author_detail) {
			$html->load_file($author_data['url'] . '/about');
			foreach ($html->find('.author-content p') as $about_cont) {
				$about_cont_text = trim($about_cont->plaintext);
				//echo $about_cont_text;
				if (preg_match('/(\d{2}\.\d{2}\.\d{4}),\s(\d{2}:\d{2}:\d{2})/', $about_cont_text, $match)) {
					$author_data['reg_date'] = $match[1] .' '. $match[2];
					$author_data['reg_range'] = round((strtotime(date('d.m.Y H:i:s')) - strtotime($author_data['reg_date'])) / (60 * 60 * 24), 4);       
					$reg_date_parts = explode(' ', $author_data['reg_date']);
					$author_data['reg_date'] = $reg_date_parts[0];
					$author_data['subscribes_day'] = round($author_data['subscribes'] / $author_data['reg_range'], 2);						
					break;
				}
			}
		}
		//$author_data['books_num_comm'] =
		//$author_data['books_num_proc'] =	
		$book_data['authors'][$i] = array_merge($book_data['authors'][$i], $author_data);
		//$authors[] = $author_data;
	}
	if ($debug_mode == 'authors') {
		echo "<pre>Все собранные ссылки с нашими (и рекомендованными) книгами:\n";
		print_r($book_data);
		echo "</pre>\n";//exit;
	}
	return $book_data;
	//$book_data['authors_'] = array_merge($book_data['authors'], $authors);
}

function checkInWidgets ($book_data, $in_widgets_mode) {
	//var_dump($book_data, __LINE__);exit;
	global $html, $debug_mode, $start_url, $headers;
	//$book_data['in_widgets'] = [];
	/*$book_data['in_widgets']['mob']['main'] = [];
	$book_data['in_widgets']['pc']['cats'] = [];
	$book_data['in_widgets']['pc']['main'] = [];*/
	$books_in_widgets = [];
	for ($cat_num = 0; $cat_num <count($book_data['categories']); $cat_num++) {
		//$matches = [];
		preg_match('|([^/]+)$|', $book_data['categories'][$cat_num]['url'], $matches);
		if ($in_widgets_mode == 'mob_main' || $in_widgets_mode == 'pc_main') {
			$widgets_url = $start_url;
		}
		else if ($in_widgets_mode == 'mob_cats'){
			$widgets_url = $start_url . '/ru/best-off/' . $matches[1];
		}		
		else if ($in_widgets_mode == 'pc_cats'){
			$widgets_url = $start_url . '/ru/top/' . $matches[1];
		}

		
		
		//var_dump($widgets_url, $in_widgets_mode, __LINE__, );return;
		//var_dump($widget_cat_url, __LINE__);continue;
		// Create a stream
		/*$headers = [
		  'http'=>[
			'header'=>'sec-ch-ua: "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"' . "\r\n" .
					  "sec-ch-ua-mobile: ?1\r\n" .
					  'sec-ch-ua-platform: "Android"' . "\r\n" .
					  "User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36\r\n"
		  ]
		];*/
		if ($in_widgets_mode == 'mob_cats' || $in_widgets_mode == 'mob_main') {
			//var_dump($widgets_url, $in_widgets_mode, $headers, __LINE__, );return;
			$context = stream_context_create($headers);
			$html->load_file($widgets_url, false, $context);
		}
		else {
			$html->load_file($widgets_url);
		}
		
		
		
		//return;
		//echo $html->find('title', 0)->plaintext."\n";//return;
		//echo $html->innertext;continue;//exit('290');
		$widgets_cats = $html->find('.widget-slider, .widget-block, .b-recommend');
		
		//var_dump(count($widgets_cats), __LINE__);return;
		
		// если не загрузилась страница с виджетами, а произошел редирект на топ (бывает в моб. эротике)
		$is_top = false;
		if (!count($widgets_cats)) {
			//var_dump(__LINE__);return;
			$first_book_top = $html->find('.js-book-item', 0);
			$first_book_top_url = $first_book_top->find('.bookCard-linkBlock', 0)->href;
			$html->load_file($start_url . $first_book_top_url, false, $context);
			//echo $html->innertext;exit('422');
			$widgets_cats = $html->find('.widget-slider');
			$is_top = true;
		}
		//var_dump(__LINE__);return;
		// проходим по всем виджетам жанра
		//var_dump(count($widgets_cats),__LINE__);
		
		//$book_data['in_widgets'][$cat_num] = [];
		foreach($widgets_cats as $iter=>$widget) {
			//echo $iter;exit;//$html->find('a[href="#bp-slider1"]', 0)->plaintext;exit;
			//echo $widget->innertext;continue;
			$widget_data = [];
			if ($is_top) {
				if ($iter == 0) $widget_name = $html->find('a[href="#bp-slider1"]', 0)->plaintext;
				else if ($iter == 1) $widget_name = $html->find('a[href="#bp-slider2"]', 0)->plaintext;
			}
			else {
				$widget_name = $widget->find('.widget-title, .widget-heading a, .widget-heading, .block-heading', 0)->plaintext;
			}
			$widget_data['widget_name'] = trim($widget_name);
			//echo $widget_data['widget_name']."\n";//return;//continue;
			// проверяем наличие книги в текущем виджете
			$book_link_count = count($widget->find('.bookCard-title a, a.bw-title, a.bl-title'));
			
			foreach ($widget->find('.bookCard-title a, a.bw-title, a.bl-title') as $iter=>$book_link) {
				$book_widget_url = $book_link->href;
			
				if ($debug_mode == 'in_widgets') {
					echo "<pre>\n";
					print_r($book_widget_url);
					print_r($book_data);//print_r($book_data);
					echo "</pre>\n";//exit;
				}
				
				//var_dump($widget_name,__LINE__);
				
				if ($start_url . $book_widget_url == $book_data['url']) {
					//var_dump($widget_name,__LINE__);
					$widget_data['rank'] = $iter + 1;
					$widget_data['widget_name'] = str_ireplace('книг', '"'.$book_data['categories'][$cat_num]['name'].'"', $widget_data['widget_name']);
					$widget_data['text'] = "$widget_data[widget_name] ($widget_data[rank]/$book_link_count)";
					//var_dump($widget_data['text']);//return;continue;//exit('426');
					$books_in_widgets[] = $widget_data['text'];
					/*if ($in_widgets_mode == 'mob_cats') $books_in_widgets['mob']['cats'][] = $widget_data['text'];
					else if ($in_widgets_mode == 'mob_main') $books_in_widgets['mob']['main'][] = $widget_data['text'];
					else if ($in_widgets_mode == 'pc_cats') $books_in_widgets['pc']['cats'][] = $widget_data['text'];
					else if ($in_widgets_mode == 'pc_main') $books_in_widgets['pc']['main'][] = $widget_data['text'];*/
					
					//$book_data['in_widgets'][$w]['place'] = $a + 1;
					//$book_data['in_widgets'][$w]['widget_ranks'] = $book_data['in_widgets'][$w]['widget_name'] .' ('. $book_data['in_widgets'][$w]['place'] . ')';
					//$book_data['in_widgets'][$w]['widget_name'] = $widget_name;
					//var_dump();
					break;
					
				}
			}
		}
		if ($in_widgets_mode == 'mob_main' || $in_widgets_mode == 'pc_main') break;
		//return;
	}
	
	// ищем на 1.. стр. всех блогов (посты автор(ов) и его книгах)
	/*$html->load_file($start_url . '/ru/blogs');
	//var_dump();exit;
	$blogs_posts_last = $html->find('.blog-item');
	$blogs_posts_count = count($html->find('.blog-item'));
	//$books_in_widgets['blogs'] = [];
	foreach ($blogs_posts_last as $blogs_post_num => $blogs_post_last) {
		$blog_post_link = $blogs_post_last->find('h3 a', 0);
		$blog_post_author = trim($blogs_post_last->find('strong + a', 0)->plaintext);
		$blog_post_anons = trim($blogs_post_last->find('.blog-abstract', 0)->plaintext);
		if ($blog_post_author == $book_data['authors'][0]['name'] ||
			(isset($book_data['authors'][1]['name']) && $blog_post_author == $book_data['authors'][1]['name'])) {
			//$books_in_widgets['blogs']['own_html'][] = '<a href="'.$blog_post_link->href.'">'.trim($blog_post_link->plaintext).'</a>';	
		}
		
		//var_dump($blog_post_header,$blog_post_author,$blog_post_anons,$blogs_posts_count);
	}*/
	//exit('473');
	//var_dump($book_data['in_widgets'], __LINE__);return;
	return $books_in_widgets;
}

function checkInBlogs($book_data) {
	global $html, $debug_mode, $start_url, $headers, $blogs_pages_num;
		// ищем на 1.. стр. всех блогов (посты автор(ов) и о его книгах)
	$regex_1 = '/\.|\,|\!|\?|\-|\;|\(|\)|\:|\—|\'|\"|\“|\”|\||\…|\ღ|\📚|\⏰|\🔥|\❤️|\|\–|\⭐|\♂️|\♀️|\#|\✨|\⬅️|\♥|\😁|\💖|\💗|\─|\⚡/u';
	$regex_2 = '/\s{2,}|\t+| {2,}/u';
	$book_name_norm = mb_strtolower(preg_replace($regex_1, ' ', $book_data['name']));
	$book_name_norm = preg_replace('/ё/u', 'е', $book_name_norm);
	$book_name_norm = trim(preg_replace($regex_2, ' ', $book_name_norm));
	//mb_str_replace
	$books_in_blogs['self'] = [];
	$books_in_blogs['others'] = [];
	for ($page = 1; $page <= $blogs_pages_num; $page++) {	
		$html->load_file($start_url . '/ru/blogs/index?page='. $page);
		//echo $html->find('title', 0)->plaintext;
		//var_dump();exit;
		$blogs_posts_last = $html->find('.blog-item');
		$blogs_posts_count = count($html->find('.blog-item'));
		//$books_in_widgets['blogs'] = [];
		//$books_in_blogs = [];
		
		foreach ($blogs_posts_last as $blogs_post_num => $blogs_post_last) {
			$blog_post_link = $blogs_post_last->find('h3 a', 0);
			$blog_post_author = trim($blogs_post_last->find('strong + a', 0)->plaintext);
			$blog_post_anons = trim($blogs_post_last->find('.blog-abstract', 0)->plaintext);
			
			$blog_post_header_norm = mb_strtolower(preg_replace($regex_1, ' ', $blog_post_link->plaintext));
			$blog_post_header_norm = preg_replace('/ё/u', 'е', $blog_post_header_norm);
			$blog_post_header_norm = trim(preg_replace($regex_2, ' ', $blog_post_header_norm));

			$blog_post_anons_norm = mb_strtolower(preg_replace($regex_1, ' ', $blog_post_anons));
			$blog_post_anons_norm = preg_replace('/ё/u', 'е', $blog_post_anons_norm);
			$blog_post_anons_norm = trim(preg_replace($regex_2, ' ', $blog_post_anons_norm));
			
			//$blog_post_header_norm = mb_strtolower(trim(preg_replace('/\s+|\./', ' ', $blog_post_link->plaintext)));
			//$blog_post_anons_norm = mb_strtolower(trim(preg_replace('/\s+|\./', ' ', $blog_post_anons)));
			
			//var_dump($book_name_norm, $blog_post_header_norm, $blog_post_anons_norm);
			// свои посты
			if ($blog_post_author == $book_data['authors'][0]['name'] ||
				(isset($book_data['authors'][1]['name']) && $blog_post_author == $book_data['authors'][1]['name'])) {
				$blogs_post_num_corr = $blogs_post_num + 1;
				$books_in_blogs['self'][] = '<a href="'.$start_url.$blog_post_link->href.'">'.trim($blog_post_link->plaintext)." ($blogs_post_num_corr/$page)</a>";	
			}			
			// чужие посты с упоминанием автора(ов) и/или книги
			//var_dump($blog_post_header,$blog_post_author,$blog_post_anons,$blogs_posts_count);
			else if (mb_strpos($blog_post_header_norm, $book_name_norm) !== false || mb_strpos($blog_post_anons_norm, $book_name_norm) !== false) {
				$books_in_blogs['others'][] = '<a href="'.$start_url.$blog_post_link->href.'">'.$blog_post_author.": ".trim($blog_post_link->plaintext)." ($blogs_post_num/$page)</a>";	
			}
		}
	}
	return $books_in_blogs;
}

function getTagRank($tag_url, $book_curr_url) {
	global $debug_mode, $start_url, $is_skip_finished, $tag_page_max, $mode_search_tags;
	
	$html = new simple_html_dom();
	
	
	//$is_found = false;
	for ($page_num = 1; $page_num <= $tag_page_max; $page_num++) {
		
		if ($mode_search_tags == 'top') $sort_mode = '';			
		else if ($mode_search_tags == 'pop-day') $sort_mode = 'sort=popular&sortPeriod=1&';
		else if ($mode_search_tags == 'pop-week') $sort_mode = 'sort=popular&sortPeriod=7&';
		else if ($mode_search_tags == 'pop-month') $sort_mode = 'sort=popular&sortPeriod=30&';
		else if ($mode_search_tags == 'pop-year') $sort_mode = 'sort=popular&sortPeriod=364&';
		else $sort_mode = '';
			
		$html->load_file($tag_url . '?' . $sort_mode . 'page=' . $page_num);
		
		$last_page_num = $html->find('.pagination .last a', 0)->plaintext;
		foreach ($html->find('.book-item') as $book_num=>$book) {
			/*if ($is_skip_finished && $book->find('.book-status-full', 0)) 
				continue;*/
			$book_url = $start_url . $book->find('.book-title a', 0)->href;
			if ($book_url == $book_curr_url) {
				return [$book_num+1, $page_num, $tag_page_max, $last_page_num];
				//$is_found  = true;
				//break;
			}
		}
		//if ($is_found) return [];
	}
	return [0, 0, $tag_page_max, $last_page_num];
}

function getDataFromLastWidgetsUpdate ($book_id) {
	global $host, $db, $user, $pass, $charset, $debug_mode;
    try {
        // Создаем подключение к базе данных
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $pdo = new PDO($dsn, $user, $pass);
        
        // Устанавливаем режим ошибок
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
 		$sql = "SELECT * FROM dates
				WHERE widgets LIKE '%:\"Обновления%' AND book_id = :book_id
				ORDER BY date_time DESC LIMIT 1";
		
        // Подготавливаем и выполняем запрос
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':book_id', $book_id, PDO::PARAM_STR);
        $stmt->execute();       
        // Получаем результаты
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
		//var_dump($results);exit('1204');
		if (!count($results)) {			
			return 'н/д';;
		}
		else {
			return $results[0];
		}
        
    } catch (PDOException $e) {
        // Обработка ошибок подключения
        echo "Ошибка подключения к базе данных: " . $e->getMessage();
        return [];
    }	
}

function getNoticesAnalysis() {
	//var_dump('http://' . $_SERVER['HTTP_HOST'] . '/data/notices.html');exit;
	global $html, $debug_mode, $start_url, $our_books_name;
	$html->load_file('data/notices.html');
	//echo $html->find('title', 0)->plaintext;exit;
	
	$notices_count = count($html->find('.notice-item'));
	echo "Всего уведомлений: $notices_count\n<br>\n<br>";
	
	$notices_liked_count = count($html->find('.like-img'));
	echo "Уведомлений с лайками : $notices_liked_count\n<br>\n<br>";
	//exit;
	
	//все уведомления
	$liked_users = [];
	foreach ($html->find('.notice-item') as $notice) {
		$div_liked = $notice->find('.like-img + div', 0);
		if (!$div_liked) continue;
		$liked_text = trim($div_liked->plaintext);
		//echo $liked_text . "\n";
		// проходим по всем нашим книгам
		//var_dump($our_books_name, __LINE__);exit;
		foreach ($our_books_name as $our_book_name) {
			if (mb_strpos($liked_text, $our_book_name) !== false) {
				$liked_users_str = mb_str_replace('Ваша книга «'.$our_book_name.'» понравилась ', '', $liked_text);
				$liked_book_users = explode(',', $liked_users_str);
				foreach ($liked_book_users as $liked_book_user) {
					$liked_users[$our_book_name][] = trim($liked_book_user);							
				}
			}			
		}
		//echo trim($div_liked->plaintext) . "\n";
		
	}
	foreach ($our_books_name as $our_book_name) {
		$liked_users[$our_book_name] = array_unique($liked_users[$our_book_name]);
		$liked_users_book_count = count($liked_users[$our_book_name]);
		echo "Лайкнувших книгу \"$our_book_name\": $liked_users_book_count\n<br>\n<br>";
	}
	
	//exit('1143');
	//echo "Уведомлений с лайками : $notices_liked_count\n<br>";
	
	$liked_users_match = array_intersect($liked_users[$our_books_name[0]] , $liked_users[$our_books_name[1]]);
	$liked_users_match_count = count($liked_users_match);
	
	$liked_users_match_0 = array_intersect($liked_users_match , $liked_users[$our_books_name[0]]);
	$liked_users_match_0_count = count($liked_users_match_0);
	
	$liked_users_match_1 = array_intersect($liked_users_match , $liked_users[$our_books_name[1]]);
	$liked_users_match_1_count = count($liked_users_match_1);
	
	echo "Совпадающих лайкнувших по всем книгам: $liked_users_match_count\n<br>\n<br>";
	
	//echo "Совпадающих лайкнувших из книги \"${our_books_name[0]}\": $liked_users_match_0_count\n<br>\n<br>";
	
	//echo "Совпадающих лайкнувших из книги \"${our_books_name[1]}\": $liked_users_match_1_count\n<br>\n<br>";

	//exit;

	echo "Совпадающие лайкнувшие всем книгам:\n<br>\n<br>";
	
	foreach ($liked_users_match as $liked_user_match) {
		echo "$liked_user_match\n<br>";
	}
	
	exit;
	//exit('1115');
	//echo $html->find('title', 0)->plaintext;
	//exit;
}

function mb_str_replace($search, $replace, $subject, $encoding = 'UTF-8') {
    if (is_array($search)) {
        foreach ($search as $key => $value) {
            $subject = mb_str_replace($value, is_array($replace) ? $replace[$key] : $replace, $subject, $encoding);
        }
        return $subject;
    }
    
    $search_len = mb_strlen($search, $encoding);
    $replace_len = mb_strlen($replace, $encoding);
    
    $pos = mb_strpos($subject, $search, 0, $encoding);
    
    while ($pos !== false) {
        $subject = mb_substr($subject, 0, $pos, $encoding) . $replace . mb_substr($subject, $pos + $search_len, null, $encoding);
        $pos = mb_strpos($subject, $search, $pos + $replace_len, $encoding);
    }
    
    return $subject;
}

// Пример использования
/*$subject = "Это пример текста с разными символами: á, é, í, ó, ú.";
$search = "пример";
$replace = "образец";

echo mb_str_replace($search, $replace, $subject); // Это образец текста с разными символами: á, é, í, ó, ú.*/

?>


