<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'init', 'sev_tort_register_rewrite_rules' );
function sev_tort_register_rewrite_rules() {
	foreach ( sev_tort_pages() as $slug => $page ) {
		add_rewrite_rule( '^' . preg_quote( $slug, '/' ) . '/?$', 'index.php?sev_tort_page=' . $slug, 'top' );
	}
}

add_filter( 'query_vars', 'sev_tort_query_vars' );
function sev_tort_query_vars( $vars ) {
	$vars[] = 'sev_tort_page';
	return $vars;
}

add_filter( 'wp_sitemaps_enabled', '__return_false' );

add_action( 'template_redirect', 'sev_tort_redirect_order_page_to_home', 1 );
function sev_tort_redirect_order_page_to_home() {
	$path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ) : '';
	$path = trim( (string) $path, '/' );

	if ( 'torty-na-zakaz' !== $path ) {
		return;
	}

	wp_safe_redirect( home_url( '/' ), 301, 'Sevastopol Tort' );
	exit;
}

add_filter( 'redirect_canonical', 'sev_tort_disable_static_seo_redirects', 10, 2 );
function sev_tort_disable_static_seo_redirects( $redirect_url, $requested_url ) {
	if ( sev_tort_is_static_seo_path() ) {
		return false;
	}

	return $redirect_url;
}

add_action( 'init', 'sev_tort_static_seo_files', 0 );
function sev_tort_static_seo_files() {
	if ( ! sev_tort_is_static_seo_path() ) {
		return;
	}

	$path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ) : '';
	$path = trim( (string) $path, '/' );

	if ( 'sitemap_index.xml' === $path ) {
		sev_tort_send_sitemap_index();
	}

	if ( 'sitemap.xml' === $path ) {
		sev_tort_send_sitemap();
	}

	if ( 'robots.txt' === $path ) {
		sev_tort_send_robots();
	}

	if ( 'llms.txt' === $path ) {
		sev_tort_send_llms_txt();
	}

	if ( 'pricing.md' === $path ) {
		sev_tort_send_pricing_md();
	}

	if ( 'pricing.txt' === $path ) {
		sev_tort_send_pricing_txt();
	}
}

function sev_tort_is_static_seo_path() {
	$path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ) : '';
	$path = trim( (string) $path, '/' );

	return in_array( $path, array( 'sitemap.xml', 'sitemap_index.xml', 'robots.txt', 'llms.txt', 'pricing.md', 'pricing.txt' ), true );
}

function sev_tort_send_sitemap_index() {
	status_header( 200 );
	header( 'Content-Type: application/xml; charset=UTF-8' );

	echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
	echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
	echo "\t" . '<sitemap>' . "\n";
	echo "\t\t" . '<loc>' . esc_url( home_url( '/sitemap.xml' ) ) . '</loc>' . "\n";
	echo "\t\t" . '<lastmod>' . esc_html( gmdate( 'Y-m-d' ) ) . '</lastmod>' . "\n";
	echo "\t" . '</sitemap>' . "\n";
	echo '</sitemapindex>';
	exit;
}

function sev_tort_send_sitemap() {
	status_header( 200 );
	header( 'Content-Type: application/xml; charset=UTF-8' );

	$pages = sev_tort_pages();
	$urls  = array(
		array(
			'loc'        => home_url( '/' ),
			'changefreq' => 'weekly',
			'priority'   => '1.0',
		),
	);

	foreach ( $pages as $page ) {
		if ( empty( $page['indexable'] ) || 'torty-na-zakaz' === $page['slug'] ) {
			continue;
		}

		$priority = in_array( $page['slug'], array( 'bento', 'detskie', 'svadebnye', 'na-den-rozhdeniya', 'ceny' ), true ) ? '0.9' : '0.8';

		$urls[] = array(
			'loc'        => home_url( '/' . $page['slug'] . '/' ),
			'changefreq' => 'weekly',
			'priority'   => $priority,
		);
	}

	echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
	echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

	foreach ( $urls as $url ) {
		echo "\t" . '<url>' . "\n";
		echo "\t\t" . '<loc>' . esc_url( $url['loc'] ) . '</loc>' . "\n";
		echo "\t\t" . '<lastmod>' . esc_html( gmdate( 'Y-m-d' ) ) . '</lastmod>' . "\n";
		echo "\t\t" . '<changefreq>' . esc_html( $url['changefreq'] ) . '</changefreq>' . "\n";
		echo "\t\t" . '<priority>' . esc_html( $url['priority'] ) . '</priority>' . "\n";
		echo "\t" . '</url>' . "\n";
	}

	echo '</urlset>';
	exit;
}

function sev_tort_send_robots() {
	status_header( 200 );
	header( 'Content-Type: text/plain; charset=UTF-8' );

	echo "User-agent: *\n";
	echo "Disallow: /wp-admin/\n";
	echo "Allow: /wp-admin/admin-ajax.php\n";
	echo "Disallow: /wp-includes/\n";
	echo "Disallow: /wp-content/plugins/\n";
	echo "Disallow: /wp-content/cache/\n";
	echo "Disallow: /wp-json/\n";
	echo "Disallow: /*?s=\n\n";
	echo 'Sitemap: ' . esc_url( home_url( '/sitemap.xml' ) ) . "\n";
	exit;
}

function sev_tort_send_llms_txt() {
	status_header( 200 );
	header( 'Content-Type: text/plain; charset=UTF-8' );

	echo implode( "\n", sev_tort_llms_lines() );
	exit;
}

function sev_tort_send_pricing_md() {
	status_header( 200 );
	header( 'Content-Type: text/markdown; charset=UTF-8' );

	echo implode( "\n", sev_tort_pricing_md_lines() );
	exit;
}

function sev_tort_send_pricing_txt() {
	status_header( 200 );
	header( 'Content-Type: text/plain; charset=UTF-8' );

	echo implode( "\n", sev_tort_pricing_txt_lines() );
	exit;
}

function sev_tort_llms_lines() {
	return array(
		'# sevastopol-tort.ru',
		'',
		'Сайт кондитерской студии в Севастополе. Основная услуга: торты на заказ с доставкой и самовывозом.',
		'',
		'## Кто мы',
		'- Название: Создаем повод для праздника',
		'- Город: Севастополь',
		'- Оператор: ИП Максимов Антон Сергеевич',
		'- Контактный телефон: ' . sev_tort_site_phone(),
		'',
		'## Услуги',
		'- Торты на заказ: https://sevastopol-tort.ru/',
		'- Бенто-торты: https://sevastopol-tort.ru/bento/',
		'- Детские торты: https://sevastopol-tort.ru/detskie/',
		'- Свадебные торты: https://sevastopol-tort.ru/svadebnye/',
		'- Корпоративные торты: https://sevastopol-tort.ru/korporativnye/',
		'- Торты на день рождения: https://sevastopol-tort.ru/na-den-rozhdeniya/',
		'- Срочный заказ торта: https://sevastopol-tort.ru/srochnyj-zakaz/',
		'- Начинки: https://sevastopol-tort.ru/nachinki/',
		'',
		'## Цены и условия',
		'- Машинно-читаемые цены: https://sevastopol-tort.ru/pricing.md',
		'- Страница цен: https://sevastopol-tort.ru/ceny/',
		'- Бенто 500-550 г: 1 500-1 800 ₽',
		'- Бенто макси около 1 кг: 2 200-2 500 ₽',
		'- Детские и торты на день рождения: 2 000-2 500 ₽/кг',
		'- Свадебные торты: базово от 3 000-4 000 ₽; сложные многоярусные композиции 10 000-13 000 ₽+',
		'- Корпоративные торты: 3 500-5 000 ₽+',
		'- Предоплата: 30%',
		'- Оплата: наличные, перевод, карта, расчетный счет',
		'- Доставка: бесплатно от 2 500 ₽; если заказ дешевле 2 500 ₽, доставка 500 ₽',
		'- География доставки: все районы Севастополя',
		'',
		'## Ключевые страницы',
		'- Доставка и оплата: https://sevastopol-tort.ru/dostavka-i-oplata/',
		'- Портфолио: https://sevastopol-tort.ru/portfolio/',
		'- Отзывы: https://sevastopol-tort.ru/otzyvy/',
		'- FAQ: https://sevastopol-tort.ru/faq/',
		'- Контакты: https://sevastopol-tort.ru/kontakty/',
		'- Политика конфиденциальности: https://sevastopol-tort.ru/politika-konfidencialnosti/',
	);
}

function sev_tort_pricing_md_lines() {
	return array(
		'# Pricing — Торты на заказ в Севастополе',
		'',
		'Last updated: ' . gmdate( 'Y-m-d' ),
		'',
		'## Бенто',
		'- Format: базовый бенто',
		'- Weight: около 500-550 г',
		'- Price: 1 500-1 800 ₽',
		'- Timing: обычно 2-4 дня; срочно при свободном окне',
		'- Good for: подарок, свидание, небольшое поздравление',
		'',
		'## Бенто макси',
		'- Format: увеличенный бенто',
		'- Weight: около 1 кг',
		'- Price: 2 200-2 500 ₽',
		'- Timing: обычно 2-4 дня',
		'- Good for: компактный торт на несколько порций',
		'',
		'## Детские торты',
		'- Format: детский торт на заказ',
		'- Weight: рассчитывается по числу гостей',
		'- Price: 2 000-2 500 ₽/кг',
		'- Extras: фигурки из мастики, съедобная печать и сложная тема увеличивают цену',
		'- Timing: лучше заказывать за 2-4 дня, сложный декор заранее',
		'',
		'## Торты на день рождения',
		'- Format: тематический праздничный торт',
		'- Weight: рассчитывается по числу гостей',
		'- Price: 2 000-2 500 ₽/кг',
		'- Extras: индивидуальный декор, цифры, персонажи и печать увеличивают цену',
		'',
		'## Свадебные торты',
		'- Format: свадебный торт, одноярусный или многоярусный',
		'- Price: базовый ярусный торт от 3 000-4 000 ₽',
		'- Complex design: 10 000-13 000 ₽+',
		'- Extras: цветы, ленты, монограмма, сложная сборка, доставка на площадку',
		'- Timing: лучше обсуждать за 1-3 недели',
		'',
		'## Корпоративные торты',
		'- Format: торт с логотипом, фирменными цветами или тематическим дизайном',
		'- Price: 3 500-5 000 ₽+',
		'- Payment: наличные, перевод, карта, расчетный счет',
		'',
		'## Delivery and payment',
		'- City: Севастополь',
		'- Delivery area: все районы Севастополя',
		'- Delivery price: бесплатно от 2 500 ₽; иначе 500 ₽',
		'- Pickup: available by agreement',
		'- Prepayment: 30%',
		'- Payment methods: наличные, перевод, карта, расчетный счет',
		'',
		'## Exact quote',
		'Точная стоимость зависит от веса, начинки, декора, срочности и доставки. Для расчета нужно указать дату, повод, количество гостей, желаемую начинку, декор и адрес доставки.',
	);
}

function sev_tort_pricing_txt_lines() {
	return array(
		'Торты на заказ в Севастополе — цены',
		'Бенто 500-550 г: 1 500-1 800 ₽; срок обычно 2-4 дня; срочно при свободном окне.',
		'Бенто макси около 1 кг: 2 200-2 500 ₽; срок обычно 2-4 дня.',
		'Детские торты: 2 000-2 500 ₽/кг; фигурки, съедобная печать и сложная тема увеличивают цену.',
		'Торты на день рождения: 2 000-2 500 ₽/кг; индивидуальный декор считается отдельно.',
		'Свадебные торты: базово от 3 000-4 000 ₽; сложные многоярусные композиции 10 000-13 000 ₽+.',
		'Корпоративные торты: 3 500-5 000 ₽+; возможна оплата на расчетный счет.',
		'Доставка по всем районам Севастополя: бесплатно от 2 500 ₽; иначе 500 ₽.',
		'Самовывоз: доступен по согласованию.',
		'Предоплата: 30%.',
		'Оплата: наличные, перевод, карта, расчетный счет.',
		'Точный расчет зависит от веса, начинки, декора, срочности и адреса доставки.',
	);
}

add_action( 'template_redirect', 'sev_tort_route_status' );
function sev_tort_route_status() {
	if ( sev_tort_current_page_config() ) {
		status_header( 200 );
	}
}

add_filter( 'template_include', 'sev_tort_template_include' );
function sev_tort_template_include( $template ) {
	$page = sev_tort_current_page_config();

	if ( ! $page ) {
		return $template;
	}

	if ( 'politika-konfidencialnosti' === $page['slug'] ) {
		return get_stylesheet_directory() . '/page-templates/page-policy.php';
	}

	if ( 'portfolio' === $page['slug'] ) {
		return get_stylesheet_directory() . '/page-templates/page-portfolio.php';
	}

	return get_stylesheet_directory() . '/page-templates/page-service.php';
}

function sev_tort_current_page_config() {
	$slug = get_query_var( 'sev_tort_page' );

	if ( ! $slug && is_front_page() ) {
		return false;
	}

	if ( ! $slug && is_page() ) {
		$slug = get_post_field( 'post_name', get_queried_object_id() );
	}

	$pages = sev_tort_pages();

	return isset( $pages[ $slug ] ) ? $pages[ $slug ] : false;
}
