<?php

use Acms\Services\Facades\Preview;

class ACMS_POST_Preview_Share extends ACMS_POST
{
    protected $lifetime = 0;

    /**
     * run
     */
    function post()
    {
        $url = $this->Post->get('uri');
        try {
            $this->validate($url);

            Preview::expiredShareUrl();
            $lifetime = 60 * 60 * intval(config('url_preview_expire', 48));
            $shareUrl = Preview::getShareUrl($url, $lifetime);

            AcmsLogger::info('プレビュー共有URLを発行しました', [
                'url' => $url,
            ]);

            Response::json([
                'status' => true,
                'uri' => $shareUrl,
            ]);
        } catch (\Exception $e) {
            AcmsLogger::notice('プレビュー共有URLの発行に失敗しました', [
                'url' => $url,
            ]);

            Response::json([
                'status' => false,
                'message' => $e->getMessage(),
            ]);
        }
    }

    /**
     * @param string $url
     */
    protected function validate($url)
    {
        if (!sessionWithContribution()) {
            throw new RuntimeException(gettext('プレビューURLを共有する権限がありません。'));
        }
        // Why not URL 自体の検証をここにも並べない: 同じ基準を Preview::getShareUrl() が発行直前に
        // 必ず通すため、二重に持つと片方だけ基準が変わったときに経路ごとの判定がドリフトする。
        $error = Preview::shareabilityError($url);
        if ($error !== null) {
            throw new RuntimeException($error);
        }
    }
}
