<?php
defined( 'ABSPATH' ) || exit;

class BW_WebP_Converter_Factory {

	const PRIORITY = array( 'cwebp', 'imagick', 'gd' );

	public static function detect( string $preference = 'auto' ): BW_WebP_Converter {
		$order = ( 'auto' === $preference )
			? self::PRIORITY
			: array_merge( array( $preference ), array_diff( self::PRIORITY, array( $preference ) ) );

		$order = apply_filters( 'bw_webp_converter_priority', $order );

		foreach ( $order as $name ) {
			$class = self::class_for( $name );
			if ( $class && $class::is_available() ) {
				return new $class();
			}
		}

		throw new RuntimeException( 'BW WebP: no converter available (cwebp/Imagick/GD all missing).' );
	}

	public static function available(): array {
		$out = array();
		foreach ( self::PRIORITY as $name ) {
			$class = self::class_for( $name );
			$out[ $name ] = $class ? $class::is_available() : false;
		}
		return $out;
	}

	private static function class_for( string $name ): ?string {
		$map = array(
			'cwebp'   => 'BW_WebP_Converter_Cwebp',
			'imagick' => 'BW_WebP_Converter_Imagick',
			'gd'      => 'BW_WebP_Converter_Gd',
		);
		return $map[ $name ] ?? null;
	}
}
