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

class BW_WebP_Converter_Imagick implements BW_WebP_Converter {

	public static function is_available(): bool {
		if ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick' ) ) {
			return false;
		}
		try {
			$formats = Imagick::queryFormats( 'WEBP' );
		} catch ( Exception $e ) {
			return false;
		}
		return ! empty( $formats );
	}

	public function name(): string {
		return 'imagick';
	}

	public function convert( string $src, string $dest, int $quality ): void {
		bw_webp_assert_safe_paths( $src, $dest );

		$quality = max( 1, min( 100, $quality ) );

		$im = null;
		try {
			$im = new Imagick( $src );
			$im->setImageFormat( 'webp' );
			$im->setImageCompressionQuality( $quality );
			$im->setOption( 'webp:method', '4' );

			$ok = $im->writeImage( $dest );
			if ( ! $ok ) {
				throw new RuntimeException( 'Imagick: writeImage returned false' );
			}
		} catch ( ImagickException $e ) {
			throw new RuntimeException( 'Imagick: ' . $e->getMessage(), 0, $e );
		} finally {
			if ( $im instanceof Imagick ) {
				$im->clear();
			}
		}

		if ( ! is_file( $dest ) || filesize( $dest ) === 0 ) {
			throw new RuntimeException( 'Imagick: destination missing or empty after run' );
		}
	}
}
