<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

// добавляем новую запись из файла
// удалять файл после публикации???
function add_new_page($fn, $UP_DIR)
{
	global $MSO;
	
	$CI = & get_instance();
	
	$data = file_get_contents($fn);
	
	// автоматические замены по всему тексту
	
	// пробуем определить следующий автоинкремент — id записи
	$query  = $CI->db->query("SHOW TABLE STATUS FROM `" . $CI->db->database . "` LIKE '" . $CI->db->dbprefix('page') . "'");
	$result = $query->result_array();
		
	if ($result)
	{
		$next_id = $result[0]['Auto_increment'];
		
		$data = str_replace('[[PAGE_FILES]]', getinfo('uploads_url') . '_pages/' . $next_id . '/', $data);
	}
	
	// прочие замены
	$data = str_replace('[[SITE_URL]]', getinfo('siteurl'), $data);
	$data = str_replace('[[UPLOADS_URL]]', getinfo('uploads_url'), $data);
		
	if ($data and preg_match('!(.*?)\n(---)(.*)!is', $data, $conf))
	{
		// только если есть шапка и текст
		if (isset($conf[1]) and isset($conf[3]))
		{
			$top = trim($conf[1]);
			$text = trim($conf[3]);
			$comments = array(); // комментарии, если есть
			
			// в тексте может быть секция ---COMMENTS-START--- ---COMMENTS-END---
			if (preg_match('!(.*?)\n(---COMMENTS-START---)(.*)\n(---COMMENTS-END---)!is', $text, $t2))
			{
				if (isset($t2[4])) // да есть секция
				{
					$text = trim($t2[1]);
					$comments = trim($t2[3]);
					
					// комментарии в свою очередь разбиваются ---
					$comments = array_map('trim', explode('---', $comments));
				}
			}
			
			$conf = _parse_key_val($top);
			
			// _log($conf, 'conf');
			
			// обязательные поля только TITLE
			if (!isset($conf['TITLE'])) return;

			// формируем данные для постинга
			
			// функции редактирования
			require_once( getinfo('common_dir') . 'functions-edit.php' ); 
			
			// дополнительные мета-данные
			// вначале формируем общий массив, после выгоняем его в ##METAFIELD##

			$page_meta_options = _find_all_meta($conf);
			
			
			// прогоняем текст через парсер
			// если он не указан, то ставим дефолтный
			if (!isset($page_meta_options['parser_content'])) $page_meta_options['parser_content'] = 'Default';
			
			$parser = $page_meta_options['parser_content']; // парсер
			$parser_all = mso_hook('parser_register', array()); // все зарегистрированные парсеры
			
			// если парсеры не зарегистрированы, то ничего не делаем
			if (isset($parser_all[$parser]['content_post_edit']))
			{
				$func = $parser_all[$parser]['content_post_edit']; // функцию, которую нужно выполнить
				if (function_exists($func)) $text = $func($text); // прогоняем текст через парсер
			}
			
			// _log($conf, 'conf');
			// _log($page_meta_options, '$page_meta_options');
			
			$meta_options = '';
			
			foreach ($page_meta_options as $key => $val)
			{
				$meta_options .= $key . '##VALUE##' . trim($val) . '##METAFIELD##';
			}
			
			
			// TYPE: blog — тип записи — делаем запрос к существующим типам
			// поскольку тип нужно будет преобразовать в его id
			
			$query = $CI->db->get('page_type');
			$res = $query->result_array();
			
			$page_type = array();
			
			foreach ($res as $key => $row)
			{
				$page_type[$row['page_type_name']] = $row['page_type_id'];
			}
			
			$type = (isset($conf['TYPE'])) ? $conf['TYPE'] : 'blog';
			
			if (isset($page_type[$type])) 
				$page_type_id = $page_type[$type];
			else
				$page_type_id = $page_type['blog'];
			
			
			// получаем все рубрики, смотрим верно ли они указаны
			// если нет, то рубрику не ставим
			// на выходе массив id реальных рубрик 
			$CI->db->select('category_id, category_name, category_slug');
			$CI->db->where('category_type', 'page');
			$query = $CI->db->get('category');
			$all_cats = $query->result_array();
			
			$cat = array();
			
			// рубрики указываются: CAT_ID или CAT_SLUG или CAT или CAT+
			if (isset($conf['CAT_ID']))
			{
				if ($c1 = mso_explode($conf['CAT_ID'])) // указанные рубрики
				{
					// перебираем и ищем их в $all_cats
					// если есть добавляем номера в общий $cat
					foreach ($c1 as $id) 
					{
						foreach ($all_cats as $catX)
						{
							if ($catX['category_id'] == $id) $cat[] = $id;
						}
					}
				}
			}
			elseif (isset($conf['CAT_SLUG']))
			{
				if ($c1 = mso_explode(strtolower($conf['CAT_SLUG']), false))
				{
					foreach ($c1 as $slug) 
					{
						foreach ($all_cats as $catX)
						{
							if ($catX['category_slug'] == $slug) $cat[] = $catX['category_id'];
						}
					}
				}
			}
			elseif (isset($conf['CAT']))
			{
				// указанные рубрики разделются /
				$c1 = explode('/', trim(mb_strtolower($conf['CAT'])));
				$c1 = array_map('trim', $c1);
				$c1 = array_map('trim', $c1);
				$c1 = array_unique($c1);
				
				if ($c1)
				{
					foreach ($c1 as $name) 
					{
						foreach ($all_cats as $catX)
						{
							if (mb_strtolower($catX['category_name']) == $name) 
							{
								$cat[] = $catX['category_id'];
							}
						}
					}
				}
			}
			elseif (isset($conf['CAT+']))
			{
				// это работает также как и CAT, но если рубрики нет, создает её с указанным именем
				// в $c1 — нормализованные рубрики, в $c2 — исходные с учетом регистра (используется при добавлении)
				$c1 = explode('/', trim($conf['CAT+']));
				$c1 = array_map('trim', $c1);
				$c1 = array_map('trim', $c1);
				$c1 = $c2 = array_unique($c1);
				$c1 = array_map('mb_strtolower', $c1);
				
				if ($c1)
				{
					$cat_add = array(); // массив, где храним новые рубрики
					
					foreach ($c1 as $key => $name) 
					{
						$f_present = false; // флаг найденности рубрики
						
						foreach ($all_cats as $catX)
						{
							if (mb_strtolower($catX['category_name']) == $name)
							{
								$cat[] = $catX['category_id'];
								$f_present = true;
							}
						}
						
						if (!$f_present) // рубрики нет, нужно её добавить
						{
							if (!in_array($c2[$key], $cat_add)) $cat_add[] = $c2[$key];
						}
					}
					
					// pr($cat_add);
					
					// добавляем новые рубрики
					if ($cat_add)
					{
						foreach($cat_add as $c_name)
						{
							$res = mso_new_category(array('category_name' => $c_name));
							
							if ($res['result']) // успешно добавлено
							{
								// заносим id рубрик к записи
								$cat[] = $res['upd_data']['category_id'];
							}
						}
					}
				}
			}

			// _pr('');
			// _log($cat, 'cat');
			// _log($all_cats, 'all_cats');
			
			$data = array(
				'page_title' => $conf['TITLE'],
				'page_content' => $text,
				'page_type_id' => $page_type_id,
				'page_meta_options' => $meta_options,
				'page_date_publish' => (isset($conf['DATE'])) ? $conf['DATE'] : date('Y-m-d H:i:s'),
			);
			
			if (isset($conf['STATUS'])) $data['page_status'] = $conf['STATUS'];
			
			if (isset($conf['MENU_ORDER'])) $data['page_menu_order'] = (int) $conf['MENU_ORDER'];
			
			if (isset($conf['COMMENT_ALLOW'])) $data['page_comment_allow'] = $conf['COMMENT_ALLOW'];
			
			if (isset($conf['PASSWORD'])) $data['page_password'] = $conf['PASSWORD'];
			
			if (isset($conf['FEED_ALLOW'])) $data['page_feed_allow'] = (int) $conf['FEED_ALLOW'];
			
			if (isset($conf['ID_AUTHOR'])) $data['page_id_autor'] = (int) $conf['ID_AUTHOR'];
			
			if (isset($conf['SLUG'])) $data['page_slug'] = $conf['SLUG'];
			
			if (isset($conf['TAG'])) $data['page_tags'] = $conf['TAG'];
			
			if ($cat) $data['page_id_cat'] = implode(',', $cat);
			
			// _log($data, 'mso_new_page');
			
			$result = mso_new_page($data);
			
			// _log();
			// _log($result, 'result');
			
			$page_id = 0;

			if (isset($result['result'][0]))
			{
				$page_id = $result['result'][0];
				
				echo($result['description'] . ' (' . str_replace($UP_DIR, '', $fn) . '): ID = ' . $page_id);
			}
			else
			{
				echo($result['description'] . ' (' . str_replace($UP_DIR, '', $fn) . ')');
			}
			
			// добавляем комментарии
			if ($page_id and $comments)
			{
				foreach($comments as $comment)
				{
					$com = _parse_key_val($comment);
					
					if (isset($com['comment_content']))
					{
						$comment_content = trim(str_replace("__NR__", "\n", $com['comment_content']));
						
						$com_data = array(
							'comments_page_id' => $page_id,
							'comments_content' => $comment_content,
							'comments_date' => (isset($com['comment_date'])) ? $com['comment_date'] : date('Y-m-d H:i:s'),
							'comments_author_ip' => (isset($com['comment_author_IP'])) ? $com['comment_author_IP'] : '1.1.1.1',
							'comments_approved' => 1,
							'comments_author_name' => (isset($com['comment_author'])) ? $com['comment_author'] : 'Аноним',
						);

						$CI->db->insert('comments', $com_data);
					}
				}
			}
			
		}
		else
		{
			echo(t('Неверный формат файла') . ' (' . str_replace($UP_DIR, '', $fn) . ')');
		}
	}
	else
	{
		echo(t('Неверный формат файла') . ' (' . str_replace($UP_DIR, '', $fn) . ')');
	}
}

// разбивает текст на элементы массив
// comment_author: Вася
// comment_author_email: mail@mail.com
// comment_author_IP: 8.8.8.8
// результат: 
// array (
// 		comment_author => Вася
// 		comment_author_email => mail@mail.com
// 		comment_author_IP => 8.8.8.8
//  )
function _parse_key_val($s)
{
	$a = array();
	
	// построчно
	$a1 = explode("\n", $s);
	
	foreach($a1 as $a2)
	{
		$pos = strpos($a2, ":");
		
		if ($pos !== false)
		{
			$a[trim(substr($a2, 0, $pos))] = trim(substr($a2, $pos + 1));
		}
	}
	
	return $a;
}

// поиск всех META-ключ: значение 
// на выходе готовый массив
function _find_all_meta($a)
{
	$o = array();
	
	foreach($a as $k => $v)
	{
		if (strpos($k, 'META-') === 0)
		{
			$o[trim(substr($k, 5))] = trim(str_replace("__NR__", "\n", $v));
		}
	}
	
	return $o;
}

// просто для лога в файл
// Для сброса _log() или _log(0)
function _log($var = 0, $name = 'LOG', $f = 'log-add-page.txt')
{
	if ($var === 0)
	{
		file_put_contents(FCPATH . $f,  "");
		return;
	}
		
	if ( !is_scalar($var) ) $var = print_r($var, true);
	
	file_put_contents(FCPATH . $f, "\n================= " . $name . " =================\n" . $var . "\n================= /" . $name . " =================\n", FILE_APPEND);
}

# end of file