<?php

namespace Acms\Services\Setup;

use Acms\Services\Facades\LocalStorage;
use Acms\Services\Facades\Database;

/**
 * setup（install / メンテナンス）で共用するヘルパー群。
 *
 * 旧 `ablogcms/setup/lib/common.php` のグローバルクラス `SetupCommon` を名前空間付きの
 * autoload 対象へ移設したもの。config.server.php の生成/差分更新は Services\ConfigServer、
 * シーケンス初期化は Services\Installer\SequenceInitializer、テーマ取り込みは Services\Installer /
 * Services\SiteSeed のドメイン層へ寄せたため、本クラスはパス整形とパーミッション判定だけを担う。
 */
class SetupCommon
{
    public static function fixPathSeparator($path)
    {
        if (DIRECTORY_SEPARATOR === '\\') {
            return implode('/', explode('\\', $path));
        } else {
            return $path;
        }
    }

    public static function checkPermission($path, $perm = '777')
    {
        if (PHP_OS === 'WIN32' || PHP_OS === 'WINNT') {
            if (!LocalStorage::isReadable($path) || !LocalStorage::isWritable($path)) {
                return false;
            }
        } elseif ($perm === '666') {
            if (!LocalStorage::isReadable($path) || !LocalStorage::isWritable($path)) {
                return false;
            }
        } elseif ($perm === '777') {
            if (!LocalStorage::isReadable($path) || !LocalStorage::isWritable($path) || !LocalStorage::isExecutable($path)) {
                return false;
            }
        }
        return true;
    }

    public static function checkAlterPerm()
    {
        Database::setThrowException(true);
        $result = true;
        try {
            $q = "ALTER TABLE `"
                . DB_PREFIX
                . "sequence` CHANGE `sequence_system_version` `sequence_system_version` VARCHAR(32) NOT NULL";
            $sql = [
                'sql' => $q,
                'params' => [],
            ];
            $res = Database::query($sql, 'exec');
            if ($res === false) {
                throw new \RuntimeException('テーブルの作成に失敗しました');
            }
        } catch (\Exception $e) {
            $result = false;
        }
        Database::setThrowException(false);
        return $result;
    }
}
