<?php

namespace Automattic\Gravatar\GravatarEnhanced\Patterns;

use Automattic\Gravatar\GravatarEnhanced\Module;

/**
 * How to add a new pattern:
 *
 * 1. Add a new entry in the `$patterns` array with its `type` and `number`
 * 2. Create a file in `classes/patterns` named `type-number.php` (e.g., `grid-pattern-1.php`) containing the pattern content
 * 3. Update the block pattern settings in `register_patterns` if needed
 */
class Patterns implements Module {
	/**
	 * Patterns.
	 *
	 * @var array<array<string, int|string>>
	 */
	private $patterns = [
		[
			'type' => 'grid-pattern',
			'number' => 1,
		],
		[
			'type' => 'grid-pattern',
			'number' => 2,
		],
		[
			'type' => 'grid-pattern',
			'number' => 3,
		],
		[
			'type' => 'grid-pattern',
			'number' => 4,
		],
		[
			'type' => 'grid-pattern',
			'number' => 5,
		],
	];

	/**
	 * @return void
	 */
	public function init() {
		add_action( 'init', [ $this, 'register_pattern_category' ] );
		add_action( 'init', [ $this, 'register_patterns' ] );
		add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_shared_style' ] );
		add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_view_style' ] );
		add_action( 'enqueue_block_assets', [ $this, 'enqueue_shared_style' ] );
		add_action( 'enqueue_block_assets', [ $this, 'enqueue_edit_style' ] );
	}

	/**
	 * Register pattern category.
	 *
	 * @return void
	 */
	public function register_pattern_category() {
		register_block_pattern_category(
			'gravatar',
			[
				'label' => __( 'Gravatar', 'gravatar-enhanced' ),
				'description' => __( 'A curated collection of block patterns to showcase Gravatar profiles.', 'gravatar-enhanced' ),
			]
		);
	}

	/**
	 * Register patterns.
	 *
	 * @return void
	 */
	public function register_patterns() {
		foreach ( $this->patterns as $pattern ) {
			$pattern_name = $pattern['type'] . '-' . $pattern['number'];
			$content = $this->get_pattern_content( $pattern_name );

			if ( ! $content ) {
				continue;
			}

			$title = '';
			$description = '';
			$keywords = [ 'gravatar', 'profile', 'user', 'user profile', 'pattern', 'layout' ];

			switch ( $pattern['type'] ) {
				case 'grid-pattern':
					// translators: %d: Pattern number.
					$title = sprintf( __( 'Gravatar profiles, grid layout #%d', 'gravatar-enhanced' ), $pattern['number'] );
					// translators: %d: Pattern number.
					$description = sprintf( __( 'Grid layout #%d for displaying Gravatar profiles.', 'gravatar-enhanced' ), $pattern['number'] );
					$keywords = array_merge( $keywords, [ 'grid', 'profiles', 'profile grid', 'user profiles', 'team', 'team showcase' ] );
					break;
				// TODO: Add more types...
			}

			register_block_pattern(
				'gravatar-enhanced/' . $pattern_name,
				[
					'title' => $title,
					'description' => $description,
					'categories' => [ 'gravatar' ],
					'keywords' => $keywords,
					'content' => $content,
				]
			);
		}
	}

	/**
	 * Enqueue the shared style.
	 *
	 * @return void
	 */
	public function enqueue_shared_style() {
		$asset_file = dirname( GRAVATAR_ENHANCED_PLUGIN_FILE ) . '/build/patterns-shared.asset.php';
		$assets = file_exists( $asset_file ) ? require $asset_file : [ 'dependencies' => [], 'version' => time() ];

		wp_enqueue_style(
			'gravatar-enhanced-patterns-shared',
			plugins_url( 'build/patterns-shared.css', GRAVATAR_ENHANCED_PLUGIN_FILE ),
			[],
			$assets['version']
		);
	}

	/**
	 * Enqueue the view style.
	 *
	 * @return void
	 */
	public function enqueue_view_style() {
		$asset_file = dirname( GRAVATAR_ENHANCED_PLUGIN_FILE ) . '/build/patterns-view.asset.php';
		$assets = file_exists( $asset_file ) ? require $asset_file : [ 'dependencies' => [], 'version' => time() ];

		wp_enqueue_style(
			'gravatar-enhanced-patterns-view',
			plugins_url( 'build/patterns-view.css', GRAVATAR_ENHANCED_PLUGIN_FILE ),
			[],
			$assets['version']
		);
	}

	/**
	 * Enqueue the edit style.
	 *
	 * @return void
	 */
	public function enqueue_edit_style() {
		$asset_file = dirname( GRAVATAR_ENHANCED_PLUGIN_FILE ) . '/build/patterns-edit.asset.php';
		$assets = file_exists( $asset_file ) ? require $asset_file : [ 'dependencies' => [], 'version' => time() ];

		wp_enqueue_style(
			'gravatar-enhanced-patterns-edit',
			plugins_url( 'build/patterns-edit.css', GRAVATAR_ENHANCED_PLUGIN_FILE ),
			[],
			$assets['version']
		);
	}

	/**
	 * Uninstall patterns.
	 *
	 * @return void
	 */
	public function uninstall() {
		unregister_block_pattern_category( 'gravatar' );

		foreach ( $this->patterns as $pattern ) {
			unregister_block_pattern( 'gravatar-enhanced/' . $pattern['type'] . '-' . $pattern['number'] );
		}
	}

	/**
	 * Get pattern content.
	 *
	 * @param string $pattern_name Pattern name.
	 * @return string|false
	 */
	private function get_pattern_content( $pattern_name ) {
		$pattern_file = dirname( GRAVATAR_ENHANCED_PLUGIN_FILE ) . '/classes/patterns/' . $pattern_name . '.php';

		if ( ! file_exists( $pattern_file ) ) {
			return false;
		}

		return file_get_contents( $pattern_file );
	}
}