<?php

use Acms\Services\Facades\Common;
use Acms\Services\Facades\Logger;
use Acms\Services\Facades\PrivateStorage;

class ACMS_POST_Export_Download extends ACMS_POST
{
    /**
     * @inheritDoc
     */
    public function post()
    {
        try {
            set_time_limit(0);
            if (!sessionWithAdministration()) {
                throw new \RuntimeException('Permission denied.');
            }

            $fileName = $this->Post->get('export_file');

            if (empty($fileName)) {
                throw new \RuntimeException('ファイルが指定されていません。');
            }
            $path = PrivateStorage::validateDirectoryTraversal(MEDIA_STORAGE_DIR . 'export_wxr/', $fileName);

            if (!PrivateStorage::exists($path)) {
                throw new \RuntimeException('ファイルが見つかりませんでした。');
            }
            Logger::info('WXRエクスポートファイルをダウンロードしました', [
                'fileName' => $fileName,
            ]);
            $downloader = App::make('response.downloader');
            // handle() は @return never。assert で型を絞らないと「送出後に処理が続く」と解析される
            assert($downloader instanceof \Acms\Services\Response\FileDownloader);
            $downloader->handle($path, $fileName, false, false, PrivateStorage::getInstance());
        } catch (\Exception $e) {
            Logger::warning('WXRエクスポートファイルのダウンロードに失敗しました', Common::exceptionArray($e));
            $this->addError($e->getMessage());
        }
        return $this->Post;
    }
}
