<?php
/**
 * Service definition for Image Processing
 */

namespace Classifai\Services;

use Classifai\Features\DescriptiveTextGenerator;
use Classifai\Taxonomy\ImageTagTaxonomy;

use function Classifai\get_asset_info;

class ImageProcessing extends Service {

	/**
	 * ImageProcessing constructor.
	 */
	public function __construct() {
		parent::__construct(
			__( 'Image Processing', 'classifai' ),
			'image_processing',
			self::get_service_providers()
		);
	}

	/**
	 * Register the Image Tags taxonomy along with
	 */
	public function init() {
		parent::init();

		$this->register_image_tags_taxonomy();

		add_filter( 'attachment_fields_to_edit', [ $this, 'custom_fields_edit' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_media_scripts' ] );
	}

	/**
	 * Get service providers for Image Processing.
	 *
	 * @return array
	 */
	public static function get_service_providers(): array {
		/**
		 * Filter the service providers for Image Processing service.
		 *
		 * @since 3.0.0
		 * @hook classifai_image_processing_service_providers
		 *
		 * @param array $providers Array of available providers for the service.
		 *
		 * @return array The filtered available providers.
		 */
		return apply_filters(
			'classifai_image_processing_service_providers',
			[
				'Classifai\Providers\Azure\ComputerVision',
				'Classifai\Providers\OpenAI\ChatGPT',
				'Classifai\Providers\OpenAI\Images',
				'Classifai\Providers\GoogleAI\Images',
				'Classifai\Providers\XAI\Grok',
				'Classifai\Providers\Localhost\OllamaMultimodal',
				'Classifai\Providers\Localhost\StableDiffusion',
				'Classifai\Providers\TogetherAI\Images',
			]
		);
	}

	/**
	 * Enqueue the script for the media modal.
	 *
	 * @since 2.4.0 Use get_asset_info to get the asset version and dependencies.
	 */
	public function enqueue_media_scripts() {
		wp_enqueue_script(
			'classifai-plugin-media-processing-js',
			CLASSIFAI_PLUGIN_URL . 'dist/classifai-plugin-media-processing.js',
			array_merge( get_asset_info( 'classifai-plugin-media-processing', 'dependencies' ), array( 'jquery', 'media-editor', 'lodash' ) ),
			get_asset_info( 'classifai-plugin-media-processing', 'version' ),
			true
		);

		$feature = new DescriptiveTextGenerator();
		wp_add_inline_script(
			'classifai-plugin-media-processing-js',
			'const classifaiMediaVars = ' . wp_json_encode(
				array(
					'enabledAltTextFields' => $feature->get_alt_text_settings() ? $feature->get_alt_text_settings() : array(),
				)
			),
			'before'
		);
	}

	/**
	 * Register a common image tag taxonomy
	 */
	protected function register_image_tags_taxonomy() {
		$tax = new ImageTagTaxonomy();
		$tax->register();
		register_taxonomy_for_object_type( 'classifai-image-tags', 'attachment' );
	}

	/**
	 * Removes the UI on attachment modals for all taxonomies introduced by this plugin.
	 *
	 * @param array $form_fields The forms fields being rendered on the modal.
	 * @return array
	 */
	public function custom_fields_edit( array $form_fields ): array {
		unset( $form_fields['classifai-image-tags'] );
		unset( $form_fields['watson-category'] );
		unset( $form_fields['watson-keyword'] );
		unset( $form_fields['watson-concept'] );
		unset( $form_fields['watson-entity'] );
		return $form_fields;
	}
}
