<?php declare(strict_types=1);

class ResolutionLimit extends Extension
{
    public function get_priority(): int
    {
        return 40;
    } // early, to veto ImageUploadEvent

    public function onImageAddition(ImageAdditionEvent $event)
    {
        global $config;
        $min_w = $config->get_int("upload_min_width", -1);
        $min_h = $config->get_int("upload_min_height", -1);
        $max_w = $config->get_int("upload_max_width", -1);
        $max_h = $config->get_int("upload_max_height", -1);
        $ratios = explode(" ", $config->get_string("upload_ratios", ""));

        $image = $event->image;

        if ($min_w > 0 && $image->width < $min_w) {
            throw new UploadException("Image too small");
        }
        if ($min_h > 0 && $image->height < $min_h) {
            throw new UploadException("Image too small");
        }
        if ($max_w > 0 && $image->width > $max_w) {
            throw new UploadException("Image too large");
        }
        if ($max_h > 0 && $image->height > $max_h) {
            throw new UploadException("Image too large");
        }

        if (count($ratios) > 0) {
            $ok = false;
            $valids = 0;
            foreach ($ratios as $ratio) {
                $parts = explode(":", $ratio);
                if (count($parts) < 2) {
                    continue;
                }
                $valids++;
                $width = $parts[0];
                $height = $parts[1];
                if ($image->width / $width == $image->height / $height) {
                    $ok = true;
                    break;
                }
            }
            if ($valids > 0 && !$ok) {
                throw new UploadException(
                    "Image needs to be in one of these ratios: ".
                    html_escape($config->get_string("upload_ratios", ""))
                );
            }
        }
    }

    public function onSetupBuilding(SetupBuildingEvent $event)
    {
        $sb = new SetupBlock("Resolution Limits");

        $sb->add_label("Min ");
        $sb->add_int_option("upload_min_width");
        $sb->add_label(" x ");
        $sb->add_int_option("upload_min_height");
        $sb->add_label(" px");

        $sb->add_label("<br>Max ");
        $sb->add_int_option("upload_max_width");
        $sb->add_label(" x ");
        $sb->add_int_option("upload_max_height");
        $sb->add_label(" px");

        $sb->add_label("<br>(-1 for no limit)");

        $sb->add_label("<br>Ratios ");
        $sb->add_text_option("upload_ratios");
        $sb->add_label("<br>(eg. '4:3 16:9', blank for no limit)");

        $event->panel->add_block($sb);
    }
}