<?php
/**
 * Main plugin class.
 *
 * @package Pendid_AI_Studio
 */

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

/**
 * Coordinates plugin hooks.
 */
class Pendid_AI_Studio_Plugin {

	/**
	 * Current image workspace instance.
	 *
	 * @var Pendid_AI_Studio_Image_Workspace|null
	 */
	private $image_workspace = null;

	/**
	 * Registers plugin hooks.
	 *
	 * @return void
	 */
	public function run() {
		add_filter( 'load_textdomain_mofile', array( $this, 'use_bundled_translation_fallback' ), 10, 2 );
		add_filter( 'gettext', array( $this, 'use_persian_v12_translation_fallback' ), 20, 3 );

		require_once PENDID_AI_STUDIO_PATH . 'includes/class-pendid-ai-studio-api-client.php';
		require_once PENDID_AI_STUDIO_PATH . 'includes/class-pendid-ai-studio-image-api.php';
		require_once PENDID_AI_STUDIO_PATH . 'includes/class-pendid-ai-studio-settings.php';

		if ( is_admin() ) {
			require_once PENDID_AI_STUDIO_PATH . 'includes/class-pendid-ai-studio-admin.php';
			require_once PENDID_AI_STUDIO_PATH . 'includes/class-pendid-ai-studio-image-workspace.php';

			$settings = new Pendid_AI_Studio_Settings();
			$admin    = new Pendid_AI_Studio_Admin(
				$settings,
				new Pendid_AI_Studio_API_Client()
			);
			$admin->run();

			$this->image_workspace = new Pendid_AI_Studio_Image_Workspace(
				$settings,
				new Pendid_AI_Studio_Image_API()
			);
			$this->image_workspace->run();

			/*
			 * The legacy admin class and the v1.2 workspace intentionally share the
			 * same menu slug. add_submenu_page() registers both render callbacks on
			 * the same page hook, so keep only the v1.2 renderer after menus exist.
			 */
			add_action( 'admin_menu', array( $this, 'deduplicate_create_image_page' ), 100 );
		}
	}

	/**
	 * Keeps only the v1.2 renderer for the Create Image page hook.
	 *
	 * @return void
	 */
	public function deduplicate_create_image_page() {
		if ( ! $this->image_workspace || ! function_exists( 'get_plugin_page_hookname' ) ) {
			return;
		}

		$page_hook = get_plugin_page_hookname( 'pendid-ai-studio-create-image', 'pendid-ai-studio' );

		if ( ! is_string( $page_hook ) || '' === $page_hook ) {
			return;
		}

		remove_all_actions( $page_hook );
		add_action( $page_hook, array( $this->image_workspace, 'render' ) );
	}

	/**
	 * Uses a bundled translation only when an official language-pack file
	 * is not already available.
	 *
	 * This keeps translate.wordpress.org language packs authoritative while
	 * allowing Persian WordPress installations to use the bundled fa_IR
	 * translation immediately.
	 *
	 * @param string $mofile Requested MO file path.
	 * @param string $domain Requested text domain.
	 * @return string
	 */
	public function use_bundled_translation_fallback( $mofile, $domain ) {
		if ( 'pendid-ai-studio' !== $domain || is_readable( $mofile ) ) {
			return $mofile;
		}

		$locale = determine_locale();
		$locale = sanitize_file_name( str_replace( '-', '_', (string) $locale ) );

		if ( '' === $locale ) {
			return $mofile;
		}

		$bundled_mofile = PENDID_AI_STUDIO_PATH . 'languages/pendid-ai-studio-' . $locale . '.mo';

		return is_readable( $bundled_mofile ) ? $bundled_mofile : $mofile;
	}

	/**
	 * Provides Persian fallbacks for v1.2 strings that are newer than the
	 * bundled fa_IR catalog. Existing official or bundled translations always win.
	 *
	 * @param string $translation Current translated value.
	 * @param string $text        Original source string.
	 * @param string $domain      Text domain.
	 * @return string
	 */
	public function use_persian_v12_translation_fallback( $translation, $text, $domain ) {
		if ( 'pendid-ai-studio' !== $domain || $translation !== $text ) {
			return $translation;
		}

		$locale = strtolower( str_replace( '-', '_', (string) determine_locale() ) );

		if ( 0 !== strpos( $locale, 'fa' ) ) {
			return $translation;
		}

		$fallbacks = array(
			'Create with the same Pendid Image engine while keeping the workflow inside WordPress.' => 'با همان موتور تصویر پن‌دید بسازید و تمام روند را داخل وردپرس انجام دهید.',
			'Connect Pendid first' => 'ابتدا پن‌دید را متصل کنید',
			'Open Pendid Settings and connect this WordPress site before creating images.' => 'پیش از ساخت تصویر، تنظیمات پن‌دید را باز کنید و این سایت وردپرسی را متصل کنید.',
			'Open Settings' => 'باز کردن تنظیمات',
			'Image settings could not be loaded' => 'تنظیمات تصویر بارگذاری نشد',
			'The editor is paused instead of using local fallback prices. Reload the page after Pendid Studio is available.' => 'برای جلوگیری از استفاده از قیمت محلی، ویرایشگر متوقف شده است. پس از در دسترس بودن استودیو پن‌دید صفحه را دوباره بارگذاری کنید.',
			'Reload' => 'بارگذاری دوباره',
			'Remaining:' => 'اعتبار باقی‌مانده:',
			'Choose a model, size, mood and optional references. Pendid handles the generation and WordPress saves the result.' => 'مدل، اندازه، حال‌وهوا و تصاویر مرجع اختیاری را انتخاب کنید. ساخت با پن‌دید انجام می‌شود و نتیجه در وردپرس ذخیره می‌شود.',
			'Every successful result is saved to the Media Library.' => 'هر نتیجه موفق در کتابخانه رسانه ذخیره می‌شود.',
			'Pendid account copy' => 'نسخه حساب پن‌دید',
			'The generated asset is also registered in Pendid Studio.' => 'فایل ساخته‌شده در استودیو پن‌دید نیز ثبت می‌شود.',
			'Pendid Image' => 'تصویر پن‌دید',
			'Model' => 'مدل',
			'Standard' => 'استاندارد',
			'Advanced' => 'پیشرفته',
			'File format' => 'فرمت فایل',
			'Image size' => 'اندازه تصویر',
			'Square' => 'مربع',
			'Landscape' => 'افقی',
			'Portrait' => 'عمودی',
			'Widescreen' => 'عریض',
			'Vertical full-screen' => 'تمام‌صفحه عمودی',
			'Standard square' => 'مربع استاندارد',
			'Standard landscape' => 'افقی استاندارد',
			'Standard portrait' => 'عمودی استاندارد',
			'Large square' => 'مربع بزرگ',
			'Large landscape' => 'افقی بزرگ',
			'Large portrait' => 'عمودی بزرگ',
			'4K landscape' => 'افقی 4K',
			'4K portrait' => 'عمودی 4K',
			'Free style' => 'طراحی آزاد',
			'Professional' => 'حرفه‌ای',
			'Sales focused' => 'فروش‌محور',
			'Luxury' => 'لوکس',
			'Modern' => 'مدرن',
			'Minimal' => 'مینیمال',
			'Friendly' => 'صمیمی',
			'Bright and playful' => 'شاد',
			'Playful' => 'بازیگوش',
			'Bold' => 'جسور',
			'Formal' => 'رسمی',
			'Technology' => 'فناورانه',
			'Natural' => 'طبیعی',
			'Editorial' => 'ادیتوریال',
			'More sizes and options' => 'اندازه‌ها و گزینه‌های بیشتر',
			'Professional size' => 'اندازه حرفه‌ای',
			'Use selected standard size' => 'استفاده از اندازه استاندارد انتخاب‌شده',
			'Professional sizes require %s or higher.' => 'اندازه‌های حرفه‌ای به پلن %s یا بالاتر نیاز دارند.',
			'Professional sizes are not available for your current Pendid plan.' => 'اندازه‌های حرفه‌ای برای پلن فعلی پن‌دید شما در دسترس نیستند.',
			'Use my Pendid Brand Kit' => 'استفاده از کیت برند پن‌دید من',
			'Apply the Brand Kit saved in your Pendid account.' => 'کیت برند ذخیره‌شده در حساب پن‌دید را اعمال کنید.',
			'Describe the subject, environment, composition, lighting, colors and any text you want.' => 'سوژه، محیط، ترکیب‌بندی، نور، رنگ‌ها و هر متنی که می‌خواهید را توضیح دهید.',
			'Reference images' => 'تصاویر مرجع',
			'Optional JPG, PNG or WebP. Up to %d images for your current plan.' => 'JPG، PNG یا WebP اختیاری. حداکثر %d تصویر برای پلن فعلی شما.',
			'Choose images' => 'انتخاب تصاویر',
			'Current Pendid price' => 'قیمت فعلی پن‌دید',
			'Generate and save' => 'ساخت و ذخیره',
			'The displayed price comes from Pendid Admin. The server remains authoritative at generation time.' => 'قیمت نمایش‌داده‌شده از مدیریت پن‌دید دریافت می‌شود و هنگام ساخت، قیمت سرور ملاک نهایی است.',
			'Describe the change you want and save it as a new image.' => 'تغییری را که می‌خواهید توضیح دهید و نتیجه را به‌عنوان یک تصویر جدید ذخیره کنید.',
			'For example: Make the background warmer and keep the subject unchanged.' => 'برای نمونه: پس‌زمینه را گرم‌تر کن و سوژه را بدون تغییر نگه دار.',
			'Edit and save new version' => 'ویرایش و ذخیره نسخه جدید',
			'Too many input images.' => 'تعداد تصاویر ورودی بیشتر از حد مجاز است.',
			'Pendid is creating your image' => 'پن‌دید در حال ساخت تصویر شماست',
			'Preparing your request...' => 'در حال آماده‌سازی درخواست...',
			'Building the composition...' => 'در حال ساخت ترکیب‌بندی تصویر...',
			'Refining the visual details...' => 'در حال تکمیل جزئیات بصری...',
			'Getting the result ready for WordPress...' => 'در حال آماده‌سازی نتیجه برای وردپرس...',
		);

		return isset( $fallbacks[ $text ] ) ? $fallbacks[ $text ] : $translation;
	}
}
