<?php
/**
 * Central field schema — internal definition store.
 *
 * Public API: Kutby\ThemeOptions\FieldRegistry.
 * Do not call Schema from pages, modules, or templates.
 *
 * @package Kutby
 * @since   2.0.0
 */

declare(strict_types=1);

namespace Kutby\ThemeOptions;

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

/**
 * Class Schema
 */
final class Schema {

	/**
	 * @return array<string, array<string, array<string, mixed>>>
	 */
	public static function all(): array {
		static $schema = null;

		if ( null !== $schema ) {
			return $schema;
		}

		$schema = array(
			'general'     => self::general(),
			'colors'      => self::colors(),
			'typography'  => self::typography(),
			'header'      => self::header(),
			'footer'      => self::footer(),
			'hero'        => self::hero(),
			'homepage'    => self::homepage(),
			'buttons'     => self::buttons(),
			'cards'       => self::cards(),
			'sidebar'     => self::sidebar(),
			'breadcrumb'  => self::breadcrumb(),
			'search'      => self::search(),
			'social'      => self::social(),
			'seo'         => self::seo(),
			'performance' => self::performance(),
		);

		/**
		 * Filter Theme Options schema.
		 *
		 * @since 2.0.0
		 *
		 * @param array<string, array<string, array<string, mixed>>> $schema Schema.
		 */
		$schema = apply_filters( 'kutby_options_schema', $schema );

		return $schema;
	}

	/**
	 * @return array<string, array<string, mixed>>
	 */
	public static function defaults(): array {
		$out = array();
		foreach ( self::all() as $group => $fields ) {
			$out[ $group ] = array();
			foreach ( $fields as $key => $field ) {
				$out[ $group ][ $key ] = $field['default'] ?? null;
			}
		}
		return $out;
	}

	/**
	 * @param string $group Group.
	 * @param string $key   Key.
	 * @return string
	 */
	public static function type( string $group, string $key ): string {
		$schema = self::all();
		return (string) ( $schema[ $group ][ $key ]['type'] ?? 'text' );
	}

	/**
	 * @param string               $group  Group id.
	 * @param array<string, mixed> $values Current values.
	 * @return array<int, array<string, mixed>>
	 */
	public static function fields_for( string $group, array $values ): array {
		$schema = self::all();
		if ( empty( $schema[ $group ] ) ) {
			return array();
		}

		$list = array();
		foreach ( $schema[ $group ] as $key => $field ) {
			$list[] = array_merge(
				$field,
				array(
					'key'   => $key,
					'id'    => sprintf( 'kutby_%s_%s', $group, $key ),
					'name'  => sprintf( 'kutby[%s][%s]', $group, $key ),
					'value' => $values[ $key ] ?? ( $field['default'] ?? '' ),
					'title' => $field['label'] ?? $key,
				)
			);
		}

		return $list;
	}

	/** @return array<string, array<string, mixed>> */
	private static function general(): array {
		return array(
			'logo_desktop'    => array( 'type' => 'media', 'label' => 'شعار سطح المكتب', 'default' => 0, 'description' => 'يفضّل صورة شفافة أو SVG.' ),
			'logo_mobile'     => array( 'type' => 'media', 'label' => 'شعار الجوال', 'default' => 0 ),
			'favicon'         => array( 'type' => 'media', 'label' => 'أيقونة الموقع', 'default' => 0 ),
			'site_width'      => array( 'type' => 'number', 'label' => 'عرض الموقع (بكسل)', 'default' => 1400, 'min' => 960, 'max' => 1920 ),
			'container_width' => array( 'type' => 'number', 'label' => 'عرض الحاوية (بكسل)', 'default' => 1200, 'min' => 640, 'max' => 1600 ),
			'enable_dark_mode'=> array( 'type' => 'toggle', 'label' => 'الوضع الداكن (جاهزية مستقبلية)', 'default' => false ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function colors(): array {
		$keys = array(
			'primary'    => 'الأساسي',
			'secondary'  => 'الثانوي',
			'accent'     => 'التأكيد',
			'background' => 'الخلفية',
			'surface'    => 'السطح',
			'card'       => 'البطاقة',
			'border'     => 'الحدود',
			'text'       => 'النص',
			'muted'      => 'نص خافت',
			'success'    => 'نجاح',
			'warning'    => 'تحذير',
			'danger'     => 'خطر',
			'link'       => 'الرابط',
			'hover'      => 'عند المرور',
		);
		$defaults = array(
			'primary' => '#0f766e', 'secondary' => '#134e4a', 'accent' => '#f59e0b',
			'background' => '#ffffff', 'surface' => '#f8fafc', 'card' => '#ffffff',
			'border' => '#e2e8f0', 'text' => '#0f172a', 'muted' => '#64748b',
			'success' => '#16a34a', 'warning' => '#d97706', 'danger' => '#dc2626',
			'link' => '#0f766e', 'hover' => '#0d9488',
		);
		$out = array();
		foreach ( $keys as $key => $label ) {
			$out[ $key ] = array(
				'type'    => 'color',
				'label'   => $label,
				'default' => $defaults[ $key ] ?? '#000000',
			);
		}
		return $out;
	}

	/** @return array<string, array<string, mixed>> */
	private static function typography(): array {
		return array(
			'font_family'    => array(
				'type'        => 'text',
				'label'       => 'عائلة الخط',
				'default'     => '"Tajawal", Tahoma, sans-serif',
				'description' => 'خط الموقع ثابت: تجوال (Tajawal) محلياً بدون CDN.',
			),
			'body_size'      => array( 'type' => 'number', 'label' => 'حجم النص (بكسل)', 'default' => 16, 'min' => 12, 'max' => 24 ),
			'heading_scale'  => array( 'type' => 'number', 'label' => 'مقياس العناوين', 'default' => 1.25, 'min' => 1, 'max' => 2, 'step' => 0.05 ),
			'line_height'    => array( 'type' => 'number', 'label' => 'ارتفاع السطر', 'default' => 1.7, 'min' => 1, 'max' => 2.5, 'step' => 0.05 ),
			'letter_spacing' => array( 'type' => 'number', 'label' => 'تباعد الحروف', 'default' => 0, 'min' => -2, 'max' => 4, 'step' => 0.1 ),
			'font_weight'    => array( 'type' => 'number', 'label' => 'سمك النص', 'default' => 400, 'min' => 300, 'max' => 900, 'step' => 100 ),
			'heading_weight' => array( 'type' => 'number', 'label' => 'سمك العناوين', 'default' => 700, 'min' => 400, 'max' => 900, 'step' => 100 ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function header(): array {
		return array(
			'layout'                => array(
				'type'    => 'select',
				'label'   => 'تخطيط الهيدر',
				'default' => 'classic',
				'options' => array(
					'classic'           => 'كلاسيكي (SaaS صف واحد)',
					'modern'            => 'عصري (صفّان)',
					'centered'          => 'وسطي',
					'education-modern'  => 'Education Modern',
				),
			),
			'sticky'                => array( 'type' => 'toggle', 'label' => 'هيدر ثابت عند التمرير', 'default' => true ),
			'height'                => array( 'type' => 'number', 'label' => 'ارتفاع الهيدر (بكسل)', 'default' => 64, 'min' => 48, 'max' => 120 ),
			'show_search'           => array( 'type' => 'toggle', 'label' => 'إظهار البحث', 'default' => true ),
			'search_style'          => array(
				'type'    => 'select',
				'label'   => 'أسلوب البحث',
				'default' => 'icon',
				'options' => array(
					'icon' => 'أيقونة',
					'form' => 'نموذج',
				),
			),
			'menu_position'         => array(
				'type'    => 'select',
				'label'   => 'موضع القائمة',
				'default' => 'center',
				'options' => array(
					'right'  => 'يمين',
					'center' => 'وسط',
					'left'   => 'يسار',
				),
			),
			'cta_enabled'           => array( 'type' => 'toggle', 'label' => 'زر الدعوة للإجراء', 'default' => true ),
			'cta_text'              => array( 'type' => 'text', 'label' => 'نص الزر', 'default' => 'تصفح الصفوف' ),
			'cta_url'               => array( 'type' => 'url', 'label' => 'رابط الزر', 'default' => '#kutby-grades-title' ),
			// Experimental (gated in components; hidden from Admin via HeaderVisibility).
			'show_theme_toggle'     => array( 'type' => 'toggle', 'label' => 'زر تبديل المظهر (تجريبي)', 'default' => false, 'description' => 'داخلي — غير مفعّل في الواجهة.' ),
			'announcement_enabled'  => array( 'type' => 'toggle', 'label' => 'شريط الإعلان', 'default' => false ),
			'announcement_text'     => array( 'type' => 'text', 'label' => 'نص الإعلان', 'default' => '' ),
			'announcement_link'     => array( 'type' => 'url', 'label' => 'رابط الإعلان', 'default' => '' ),
			'show_account'          => array( 'type' => 'toggle', 'label' => 'رابط الحساب (تجريبي)', 'default' => false, 'description' => 'داخلي — غير مفعّل في الواجهة.' ),
			'show_social'           => array( 'type' => 'toggle', 'label' => 'أيقونات التواصل في الهيدر (تجريبي)', 'default' => false, 'description' => 'داخلي — غير مفعّل في الواجهة.' ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function footer(): array {
		return array(
			'layout'                  => array(
				'type'    => 'select',
				'label'   => 'تخطيط الفوتر',
				'default' => 'classic',
				'options' => array(
					'classic' => 'كلاسيكي',
					'modern'  => 'عصري',
					'minimal' => 'مبسط',
				),
			),
			'columns'                 => array( 'type' => 'number', 'label' => 'أعمدة الفوتر', 'default' => 4, 'min' => 1, 'max' => 4 ),
			'show_logo'               => array( 'type' => 'toggle', 'label' => 'إظهار الشعار', 'default' => true ),
			'show_nav'                => array( 'type' => 'toggle', 'label' => 'إظهار قائمة الفوتر', 'default' => true ),
			'show_widgets'            => array( 'type' => 'toggle', 'label' => 'إظهار مناطق الودجات', 'default' => true ),
			'copyright'               => array( 'type' => 'textarea', 'label' => 'نص حقوق النشر', 'default' => '' ),
			'show_social'             => array( 'type' => 'toggle', 'label' => 'أيقونات التواصل', 'default' => true ),
			'back_to_top'             => array( 'type' => 'toggle', 'label' => 'زر العودة للأعلى', 'default' => true ),
			'show_newsletter'         => array( 'type' => 'toggle', 'label' => 'نموذج النشرة البريدية', 'default' => false ),
			'newsletter_title'        => array( 'type' => 'text', 'label' => 'عنوان النشرة', 'default' => 'النشرة البريدية' ),
			'newsletter_placeholder'  => array( 'type' => 'text', 'label' => 'نص حقل البريد', 'default' => 'بريدك الإلكتروني' ),
			'show_payment'            => array( 'type' => 'toggle', 'label' => 'عرض طرق الدفع', 'default' => false ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function hero(): array {
		return array(
			'layout'           => array(
				'type'    => 'select',
				'label'   => 'تخطيط البطل',
				'default' => 'classic',
				'options' => array(
					'classic'  => 'كلاسيكي',
					'magazine' => 'مجلة',
					'grid'     => 'شبكة',
					'minimal'  => 'مبسط',
				),
			),
			'posts_count'      => array( 'type' => 'number', 'label' => 'عدد المقالات', 'default' => 5, 'min' => 1, 'max' => 24 ),
			'featured_source'  => array(
				'type'    => 'select',
				'label'   => 'مصدر المقالات',
				'default' => 'latest',
				'options' => array(
					'latest'   => 'الأحدث',
					'sticky'   => 'المثبتة',
					'category' => 'تصنيف',
					'tag'      => 'وسم',
					'manual'   => 'اختيار يدوي',
				),
			),
			'category'         => array( 'type' => 'number', 'label' => 'معرّف التصنيف', 'default' => 0, 'min' => 0 ),
			'tag'              => array( 'type' => 'number', 'label' => 'معرّف الوسم', 'default' => 0, 'min' => 0 ),
			'manual_ids'       => array( 'type' => 'text', 'label' => 'معرّفات المقالات (مفصولة بفاصلة)', 'default' => '' ),
			'title'            => array( 'type' => 'text', 'label' => 'عنوان القسم المبسط', 'default' => '' ),
			'subtitle'         => array( 'type' => 'text', 'label' => 'النص الفرعي', 'default' => '' ),
			'show_meta'        => array( 'type' => 'toggle', 'label' => 'إظهار البيانات الوصفية', 'default' => true ),
			'show_category'    => array( 'type' => 'toggle', 'label' => 'إظهار التصنيف', 'default' => true ),
			'show_author'      => array( 'type' => 'toggle', 'label' => 'إظهار الكاتب', 'default' => true ),
			'show_date'        => array( 'type' => 'toggle', 'label' => 'إظهار التاريخ', 'default' => true ),
			'show_excerpt'     => array( 'type' => 'toggle', 'label' => 'إظهار المقتطف', 'default' => true ),
			'overlay'          => array( 'type' => 'toggle', 'label' => 'تظليل الصورة', 'default' => true ),
			'image_ratio'      => array(
				'type'    => 'select',
				'label'   => 'نسبة الصورة',
				'default' => '16x9',
				'options' => array(
					'16x9' => '16:9',
					'4x3'  => '4:3',
					'1x1'  => '1:1',
					'21x9' => '21:9',
				),
			),
			'container_width'  => array(
				'type'    => 'select',
				'label'   => 'عرض الحاوية',
				'default' => 'default',
				'options' => array(
					'default' => 'افتراضي',
					'narrow'  => 'ضيق',
					'wide'    => 'واسع',
				),
			),
			'spacing'          => array(
				'type'    => 'select',
				'label'   => 'التباعد',
				'default' => 'normal',
				'options' => array(
					'compact' => 'مضغوط',
					'normal'  => 'عادي',
					'relaxed' => 'واسع',
				),
			),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function homepage(): array {
		$sections = array(
			'hero'              => 'قسم البطل',
			'semester_nav'      => 'تصفح الفصول الدراسية',
			'grades'            => 'شبكة الصفوف',
			'subjects'          => 'المواد الدراسية',
			'latest_files'      => 'أحدث الملفات',
			'latest_articles'   => 'أحدث المقالات',
			'calendar'          => 'التقويم التعليمي',
			'app_banner'        => 'تطبيق الجوال',
			'about'             => 'عن الموقع',
			'popular_subjects'  => 'أشهر المواد (قديم)',
			'popular_downloads' => 'الأكثر تحميلاً (قديم)',
			'statistics'        => 'الإحصائيات (قديم)',
		);
		$out = array();
		foreach ( $sections as $key => $label ) {
			$default = ! in_array( $key, array( 'popular_subjects', 'popular_downloads', 'statistics' ), true );
			$out[ $key ] = array( 'type' => 'toggle', 'label' => $label, 'default' => $default );
		}
		return $out;
	}

	/** @return array<string, array<string, mixed>> */
	private static function buttons(): array {
		return array(
			'radius'      => array( 'type' => 'number', 'label' => 'استدارة الزوايا (بكسل)', 'default' => 8 ),
			'padding_y'   => array( 'type' => 'number', 'label' => 'حشوة رأسية (بكسل)', 'default' => 12 ),
			'padding_x'   => array( 'type' => 'number', 'label' => 'حشوة أفقية (بكسل)', 'default' => 20 ),
			'font_weight' => array( 'type' => 'number', 'label' => 'سمك الخط', 'default' => 600, 'min' => 400, 'max' => 800, 'step' => 100 ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function cards(): array {
		return array(
			'radius'  => array( 'type' => 'number', 'label' => 'استدارة الزوايا (بكسل)', 'default' => 12 ),
			'shadow'  => array(
				'type'    => 'select',
				'label'   => 'الظل',
				'default' => 'sm',
				'options' => array(
					'none' => 'بدون',
					'sm'   => 'خفيف',
					'md'   => 'متوسط',
					'lg'   => 'قوي',
				),
			),
			'padding' => array( 'type' => 'number', 'label' => 'الحشوة الداخلية (بكسل)', 'default' => 20 ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function sidebar(): array {
		return array(
			'enabled'  => array( 'type' => 'toggle', 'label' => 'تفعيل الشريط الجانبي', 'default' => true ),
			'position' => array(
				'type'    => 'select',
				'label'   => 'الموضع',
				'default' => 'left',
				'options' => array(
					'right' => 'يمين',
					'left'  => 'يسار',
				),
			),
			'width'    => array( 'type' => 'number', 'label' => 'العرض (بكسل)', 'default' => 320, 'min' => 240, 'max' => 420 ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function breadcrumb(): array {
		return array(
			'enabled'   => array( 'type' => 'toggle', 'label' => 'تفعيل مسار التنقل', 'default' => true ),
			'separator' => array( 'type' => 'text', 'label' => 'الفاصل', 'default' => '/' ),
			'home_text' => array( 'type' => 'text', 'label' => 'نص الرئيسية', 'default' => 'الرئيسية', 'placeholder' => 'الرئيسية' ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function search(): array {
		return array(
			'placeholder' => array( 'type' => 'text', 'label' => 'نص الحقل', 'default' => 'ابحث هنا…', 'placeholder' => 'ابحث هنا…' ),
			'ajax'        => array( 'type' => 'toggle', 'label' => 'بحث فوري', 'default' => false ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function social(): array {
		return array(
			'facebook'  => array( 'type' => 'url', 'label' => 'فيسبوك', 'default' => '' ),
			'twitter'   => array( 'type' => 'url', 'label' => 'إكس (تويتر)', 'default' => '' ),
			'telegram'  => array( 'type' => 'url', 'label' => 'تيليجرام', 'default' => '' ),
			'whatsapp'  => array( 'type' => 'url', 'label' => 'واتساب', 'default' => '' ),
			'youtube'   => array( 'type' => 'url', 'label' => 'يوتيوب', 'default' => '' ),
			'instagram' => array( 'type' => 'url', 'label' => 'إنستغرام', 'default' => '' ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function seo(): array {
		return array(
			'open_graph'        => array( 'type' => 'toggle', 'label' => 'بيانات المشاركة الاجتماعية', 'default' => true ),
			'twitter_cards'     => array( 'type' => 'toggle', 'label' => 'بطاقات إكس', 'default' => true ),
			'canonical'         => array( 'type' => 'toggle', 'label' => 'الروابط الأساسية', 'default' => true ),
			'schema'            => array( 'type' => 'toggle', 'label' => 'البيانات المنظمة', 'default' => true ),
			'breadcrumb_schema' => array( 'type' => 'toggle', 'label' => 'بيانات مسار التنقل المنظمة', 'default' => true ),
		);
	}

	/** @return array<string, array<string, mixed>> */
	private static function performance(): array {
		return array(
			'disable_emojis'        => array( 'type' => 'toggle', 'label' => 'تعطيل الرموز التعبيرية', 'default' => true ),
			'disable_embeds'        => array( 'type' => 'toggle', 'label' => 'تعطيل التضمين', 'default' => true ),
			'disable_xmlrpc'        => array( 'type' => 'toggle', 'label' => 'تعطيل واجهة الربط القديمة', 'default' => true ),
			'disable_dashicons'     => array( 'type' => 'toggle', 'label' => 'تعطيل أيقونات لوحة التحكم للزوار', 'default' => true ),
			'disable_gutenberg_css' => array( 'type' => 'toggle', 'label' => 'تعطيل تنسيقات المحرر في الواجهة', 'default' => false ),
			'remove_query_strings'  => array( 'type' => 'toggle', 'label' => 'إزالة معاملات الإصدار من الملفات', 'default' => false ),
			'lazy_load'             => array( 'type' => 'toggle', 'label' => 'التحميل الكسول للصور', 'default' => true ),
			'preload_fonts'         => array( 'type' => 'toggle', 'label' => 'التحميل المسبق للخطوط', 'default' => true ),
		);
	}
}
