<?php

/*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <rodolfo@chevere.org>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

declare(strict_types=1);

namespace Chevere\Demo\Actions;

use Chevere\Action\Action;
use Chevere\Parameter\Attributes\StringAttr;
use Chevere\Parameter\Interfaces\StringParameterInterface;
use RuntimeException;
use function Chevere\Parameter\string;

class ImageResize extends Action
{
    public const FIT_WIDTH = [
        'thumbnail' => 50,
        'poster' => 150,
    ];

    public function __invoke(
        #[StringAttr('/\.jpe?g$/')]
        string $file,
        string $fit
    ): string {
        [$width, $height] = getimagesize($file);
        $targetWidth = self::FIT_WIDTH[$fit];
        $targetHeight = intval($height / $width * $targetWidth);
        $image = imagecreatetruecolor($targetWidth, $targetHeight);
        $source = imagecreatefromjpeg($file);
        imagecopyresampled($image, $source, 0, 0, 0, 0, $targetWidth, $targetHeight, $width, $height);
        $pos = strrpos($file, '.');
        $target = substr($file, 0, $pos)
            . ".{$fit}"
            . substr($file, $pos);

        return imagejpeg($image, $target)
            ? $target
            : throw new RuntimeException('Unable to save image');
    }

    public static function acceptReturn(): StringParameterInterface
    {
        return string();
    }
}
