<?php declare(strict_types=1);

class BulkDownloadConfig
{
    public const SIZE_LIMIT = "bulk_download_size_limit";
}
class BulkDownloadException extends BulkActionException
{
}


class BulkDownload extends Extension
{
    private const DOWNLOAD_ACTION_NAME = "bulk_download";

    public function onInitExt(InitExtEvent $event)
    {
        global $config;
        $config->set_default_int(BulkDownloadConfig::SIZE_LIMIT, parse_shorthand_int('100MB'));
    }

    public function onBulkActionBlockBuilding(BulkActionBlockBuildingEvent $event)
    {
        global $user, $config;

        if ($user->can(Permissions::BULK_DOWNLOAD)) {
            $event->add_action(BulkDownload::DOWNLOAD_ACTION_NAME, "Download ZIP");
        }
    }

    public function onSetupBuilding(SetupBuildingEvent $event)
    {
        $sb = new SetupBlock("Bulk Download");

        $sb->start_table();
        $sb->add_shorthand_int_option(BulkDownloadConfig::SIZE_LIMIT, "Size Limit", true);
        $sb->end_table();

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

    public function onBulkAction(BulkActionEvent $event)
    {
        global $user, $page, $config;

        if ($user->can(Permissions::BULK_DOWNLOAD)&&
            ($event->action == BulkDownload::DOWNLOAD_ACTION_NAME)) {
            $download_filename = $user->name . '-' . date('YmdHis') . '.zip';
            $zip_filename = tempnam(sys_get_temp_dir(), "shimmie_bulk_download");
            $zip = new ZipArchive;
            $size_total = 0;
            $max_size = $config->get_int(BulkDownloadConfig::SIZE_LIMIT);

            if ($zip->open($zip_filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) === true) {
                foreach ($event->items as $image) {
                    $img_loc = warehouse_path(Image::IMAGE_DIR, $image->hash, false);
                    $size_total += filesize($img_loc);
                    if ($size_total>$max_size) {
                        throw new BulkDownloadException("Bulk download limited to ".human_filesize($max_size));
                    }


                    $filename = urldecode($image->get_nice_image_name());
                    $filename = str_replace(":", ";", $filename);
                    $zip->addFile($img_loc, $filename);
                }

                $zip->close();

                $page->set_mode(PageMode::FILE);
                $page->set_file($zip_filename, true);
                $page->set_filename($download_filename);

                $event->redirect = false;
            }
        }
    }
}