<?php
/**
 * Deterministic renderer for packaged source-parity fixtures.
 *
 * This is not a WordPress replacement. It runs the production PHP render
 * callbacks against a deliberately small compatibility shim so the packaged
 * candidate fixture is generated from the actual theme code without network,
 * database, or filesystem writes outside the requested fixture directory.
 */

declare(strict_types=1);

$theme_root = dirname(__DIR__, 2);
$output_dir = $argv[1] ?? __DIR__ . '/fixtures/wordpress';
if (!is_dir($output_dir) && !mkdir($output_dir, 0775, true) && !is_dir($output_dir)) {
	fwrite(STDERR, "Could not create fixture output directory.\n");
	exit(2);
}

define('ABSPATH', __DIR__ . '/wp-stub/');
define('HAPANTHEON_DIR', $theme_root);
define('HAPANTHEON_URI', '../../../..');
define('HAPANTHEON_VERSION', '2.1.0');
define('OBJECT', 'OBJECT');

$GLOBALS['hp_unique_id'] = 0;
$GLOBALS['hp_fixture_posts'] = array(
	(object) array('ID'=>101,'post_title'=>'הלילה שבו נגמר לי הדלק בערבה','post_name'=>'the-night-the-fuel-ran-out','post_excerpt'=>'עצירה לא מתוכננת, שמיים בלתי נשכחים, ושיחה אחת עם זר.','category'=>'stories','image'=>'reflection.jpg'),
	(object) array('ID'=>102,'post_title'=>'אספרסו קר ביחס הזהב: 1:15','post_name'=>'golden-ratio-cold-espresso','post_excerpt'=>'שלוש שנים של ניסויים, יחס אחד מנצח, ו־18 שעות של סבלנות.','category'=>'recipes','image'=>'espresso.jpg'),
	(object) array('ID'=>103,'post_title'=>'שבוע בקאפאדוקיה בלי מפה','post_name'=>'cappadocia-without-a-map','post_excerpt'=>'ניסוי במסע: לוותר על הניווט ולסמוך על אנשים.','category'=>'travel','image'=>'travel.jpg'),
	(object) array('ID'=>104,'post_title'=>'שולחן אלון בלי בורג אחד','post_name'=>'oak-table-without-screws','post_excerpt'=>'שישה שבועות בנגרייה, מהקורה הגולמית עד שכבת השמן.','category'=>'diy','image'=>'craft.jpg'),
	(object) array('ID'=>105,'post_title'=>'על ההבדל שבין אוסף לארכיון','post_name'=>'collection-versus-archive','post_excerpt'=>'אוסף שואל “כמה”. ארכיון שואל “מה ראוי להישאר”.','category'=>'oracle','image'=>'temple.jpg'),
	(object) array('ID'=>106,'post_title'=>'המכתב שמצאתי בספר יד שנייה','post_name'=>'the-letter-inside-a-used-book','post_excerpt'=>'קניתי ספר בשקל. קיבלתי משימה שלא ביקשתי.','category'=>'stories','image'=>'writing.jpg'),
	(object) array('ID'=>107,'post_title'=>'מחמצת בת ארבע שנים: פרוטוקול מלא','post_name'=>'four-year-sourdough-protocol','post_excerpt'=>'היחסים, הטמפרטורות ולוח הזמנים מתוך מאות אפיות.','category'=>'recipes','image'=>'food.jpg'),
	(object) array('ID'=>108,'post_title'=>'הרכבת הלילית לפלובדיב','post_name'=>'night-train-to-plovdiv','post_excerpt'=>'מסלול הבלקן שאף אחד לא ממליץ עליו.','category'=>'travel','image'=>'travel.jpg'),
	(object) array('ID'=>109,'post_title'=>'מנורת פליז ממצבר ישן','post_name'=>'brass-lamp-from-an-old-battery','post_excerpt'=>'פרויקט מתכת ראשון, כולל מה שנשרף.','category'=>'diy','image'=>'technology.jpg'),
	(object) array('ID'=>110,'post_title'=>'סנקה על הזמן ועל הפיד שלכם','post_name'=>'seneca-time-and-your-feed','post_excerpt'=>'קריאה מחודשת ב“על קוצר החיים” מול מסך אינסופי.','category'=>'oracle','image'=>'reflection.jpg'),
);

function __( $text, $domain = null ) { return $text; }
function _e( $text, $domain = null ) { echo $text; }
function esc_html__( $text, $domain = null ) { return htmlspecialchars((string)$text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function esc_attr__( $text, $domain = null ) { return htmlspecialchars((string)$text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function esc_html_e( $text, $domain = null ) { echo esc_html__($text, $domain); }
function esc_attr_e( $text, $domain = null ) { echo esc_attr__($text, $domain); }
function esc_html( $text ) { return htmlspecialchars((string)$text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function esc_attr( $text ) { return htmlspecialchars((string)$text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function esc_url( $url ) { return htmlspecialchars((string)$url, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function esc_url_raw( $url ) { return (string)$url; }
function wp_kses_post( $html ) { return (string)$html; }
function wpautop( $text ) { return '<p>' . preg_replace("/\n\s*\n/", '</p><p>', esc_html($text)) . '</p>'; }
function sanitize_key( $key ) { return preg_replace('/[^a-z0-9_\-]/', '', strtolower((string)$key)); }
function sanitize_title( $text ) { return sanitize_key(str_replace(' ', '-', (string)$text)); }
function sanitize_email( $email ) { return filter_var((string)$email, FILTER_SANITIZE_EMAIL); }
function sanitize_text_field( $value ) { return trim(strip_tags((string)$value)); }
function absint( $value ) { return abs((int)$value); }
function is_wp_error( $value ) { return false; }
function add_action() {}
function add_shortcode() {}
function register_block_type() {}
function wp_register_script() {}
function wp_register_style() {}
function wp_localize_script() {}
function shortcode_atts( $defaults, $atts ) { return array_merge($defaults, array_intersect_key((array)$atts, $defaults)); }
function wp_unslash( $value ) { return $value; }
function wp_json_encode( $value ) { return json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); }
function wp_unique_id( $prefix = '' ) { $GLOBALS['hp_unique_id']++; return $prefix . $GLOBALS['hp_unique_id']; }
function get_block_wrapper_attributes( $extra = array() ) { return 'class="' . esc_attr(trim('wp-block-source-fixture ' . ($extra['class'] ?? ''))) . '"'; }
function home_url( $path = '/' ) { return '#' . ltrim((string)$path, '/'); }
function admin_url( $path = '' ) { return '#admin-' . ltrim((string)$path, '/'); }
function get_privacy_policy_url() { return '#privacy-policy'; }
function get_page_by_path( $path, $output = OBJECT, $post_type = 'page' ) { foreach ($GLOBALS['hp_fixture_posts'] as $p) if ($p->post_name === $path) return $p; return null; }
function get_theme_mod( $key, $default = false ) { return $default; }
function get_option( $key, $default = false ) { if ('admin_email' === $key) return 'hello@example.com'; return $default; }
function wp_get_referer() { return false; }
function wp_validate_redirect( $url, $fallback ) { return $url ?: $fallback; }
function remove_query_arg( $keys, $url ) { return $url; }
function add_query_arg( $key, $value, $url ) { return $url; }
function antispambot( $email ) { return $email; }
function wp_nonce_field( $action, $name ) { echo '<input type="hidden" name="' . esc_attr($name) . '" value="fixture-nonce">'; }
function wp_get_attachment_image_url() { return false; }
function has_post_thumbnail( $post_id = 0 ) { return true; }
function get_the_post_thumbnail_url( $post_id = 0, $size = 'full' ) { $p = hp_post($post_id); return HAPANTHEON_URI . '/assets/images/demo/' . ($p->image ?? 'reflection.jpg'); }
function get_post_meta( $post_id, $key, $single = false ) { if ('_hapantheon_featured_url' === $key) return get_the_post_thumbnail_url($post_id); return ''; }
function get_post_field( $field, $post_id ) { return ''; }
function wp_strip_all_tags( $text ) { return strip_tags((string)$text); }
function get_the_ID() { return 101; }
function get_the_category( $post_id = 0 ) { $p = hp_post($post_id); $slug = $p->category ?? 'stories'; return array((object)array('slug'=>$slug,'name'=>hp_category_name($slug),'term_id'=>crc32($slug)%1000,'count'=>2)); }
function get_term_by( $field, $value, $taxonomy ) { return (object)array('slug'=>$value,'name'=>hp_category_name($value),'term_id'=>crc32($value)%1000,'count'=>2); }
function get_category_link( $term_id ) { return '#category-' . (int)$term_id; }
function get_permalink( $post = null ) { $p = is_object($post) ? $post : hp_post((int)$post); return '#post-' . ($p->post_name ?? 'item'); }
function get_the_title( $post = null ) { $p = is_object($post) ? $post : hp_post((int)$post); return $p->post_title ?? ''; }
function get_the_excerpt( $post = null ) { $p = is_object($post) ? $post : hp_post((int)$post); return $p->post_excerpt ?? ''; }
function get_posts( $args = array() ) { $posts = $GLOBALS['hp_fixture_posts']; if (!empty($args['category_name'])) $posts=array_values(array_filter($posts, fn($p)=>$p->category===$args['category_name'])); return array_slice($posts,0,(int)($args['posts_per_page']??5)); }
function wp_reset_postdata() {}
function hp_post( $id ) { foreach ($GLOBALS['hp_fixture_posts'] as $p) if ((int)$p->ID===(int)$id) return $p; return $GLOBALS['hp_fixture_posts'][0]; }
function hp_category_name( $slug ) { return array('recipes'=>'מתכונים','stories'=>'סיפורים','travel'=>'טיולים','diy'=>'מלאכה','oracle'=>'האורקל')[$slug] ?? 'ארכיון'; }

class WP_Query {
	public array $posts = array();
	public function __construct( $args = array() ) { $this->posts = get_posts($args); }
}

require_once $theme_root . '/inc/template-tags.php';
require_once $theme_root . '/inc/forms.php';
require_once $theme_root . '/inc/source-blocks.php';

function hp_shell( string $title, string $content ): string {
	$template = <<<'HTML'
<!doctype html><html lang="he" dir="rtl" data-theme="light"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>__TITLE__</title><link rel="stylesheet" href="../../../../assets/css/pantheon.css"><link rel="stylesheet" href="../../../../assets/css/wordpress.css"><style>.fixture-note{position:fixed;inset:auto auto 4px 4px;z-index:9999;font:10px/1.2 monospace;color:#555;background:#fff8;padding:2px 4px}.footer{margin-top:0}</style></head><body class="hapantheon-theme"><header class="nav solid" id="nav"><div class="wrap nav-in"><a class="brand" href="#"><span>הַפַּנְתֵּאוֹן<small class="en">SOURCE CONTRACT</small></span></a><nav class="primary-navigation" aria-label="ניווט ראשי"><ul class="links"><li><a href="#">ראשי</a></li><li><a href="#">ארכיון</a></li><li><a href="#">אודות</a></li></ul></nav><button class="tgl" type="button" onclick="toggleTheme()" aria-label="ערכת צבעים">◐</button></div></header><main id="primary">__CONTENT__</main><footer class="footer"><div class="meander"></div><div class="wrap footer-in"><span>הַפַּנְתֵּאוֹן</span><a href="#">ארכיון חי</a></div></footer><span class="fixture-note" aria-hidden="true">deterministic source-contract fixture</span><script>window.hapantheonData={"accessibilityUrl":"#accessibility","copySuccess":"הקישור הועתק"};</script><script src="../../../../assets/js/pantheon.js"></script></body></html>
HTML;
	return str_replace(
		array( '__TITLE__', '__CONTENT__' ),
		array( esc_html( $title ), $content ),
		$template
	);
}

$pages = array(
	'home'    => 'index.blocks.html',
	'about'   => 'about.blocks.html',
	'oracle'  => 'oracle.blocks.html',
	'faq'     => 'faq.blocks.html',
	'contact' => 'contact.blocks.html',
	'recipe'  => 'recipe-body.blocks.html',
);

foreach ($pages as $slug => $filename) {
	$GLOBALS['hp_unique_id'] = 0;
	$raw = file_get_contents($theme_root . '/demo/content/' . $filename);
	if (false === $raw) {
		fwrite(STDERR, "Missing demo content: {$filename}\n");
		exit(3);
	}
	preg_match_all('/<!--\s+wp:hapantheon\/([a-z0-9-]+)\s+(\{.*\})\s+\/-->/u', $raw, $matches, PREG_SET_ORDER);
	$content = '';
	foreach ($matches as $match) {
		$attributes = json_decode($match[2], true, 512, JSON_THROW_ON_ERROR);
		$content .= hapantheon_render_source_block($attributes, '', (object)array('name'=>'hapantheon/' . $match[1]));
	}
	file_put_contents($output_dir . '/' . $slug . '.html', hp_shell(ucfirst($slug), $content));
}
