<?php

declare(strict_types=1);

namespace Acms\Services\License;

/**
 * 検証済みのライセンス応答値から license.php の内容（PHP ソース文字列）を組み立てる。
 *
 * 保存形式（define() の羅列）は既存の license.php と互換性を保つため変更しない。
 * 各値は var_export() でエンコードすることで、値に PHP ソースとして解釈される文字
 * （引用符・セミコロン等）が含まれていても構文として素通りしないようにする。
 * グローバル状態には触れない純粋関数として、Application から呼び出される。
 */
final class LicenseFileContentBuilder
{
    /**
     * @param array{
     *     domain: string,
     *     hash: string,
     *     blogLimit: int,
     *     expire: string,
     *     plan: string,
     *     payment: string,
     *     edition: string,
     *     optionSubdomain: int|null,
     *     optionPlusdomain: int
     * } $license LicenseResponseValidator::validate() の戻り値
     * @param int $lastActivationTime
     * @return string
     */
    public static function build(array $license, int $lastActivationTime): string
    {
        $content = '<' . '?' . 'php ' . PHP_EOL;
        $content .= "define('LICENSE_DOMAIN', " . var_export($license['domain'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_BLOG_LIMIT', " . var_export($license['blogLimit'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_HASH', " . var_export($license['hash'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_EXPIRE', " . var_export($license['expire'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_PERIOD', null);" . PHP_EOL;
        $content .= "define('LICENSE_PLAN', " . var_export($license['plan'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_PAYMENT', " . var_export($license['payment'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_DEVELOPMENT', 0);" . PHP_EOL;
        $content .= "define('LICENSE_EDITION', " . var_export($license['edition'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_OPTION_SUBDOMAIN', " . var_export($license['optionSubdomain'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_OPTION_PLUSDOMAIN', " . var_export($license['optionPlusdomain'], true) . ");" . PHP_EOL;
        $content .= "define('LICENSE_PLUGIN_MAILMAGAZINE', true);" . PHP_EOL;
        $content .= "define('LICENSE_LAST_ACTIVATION_TIME', " . var_export($lastActivationTime, true) . ");" . PHP_EOL;
        return $content;
    }
}
