<?php

namespace Acms\Services\Update\System;

/**
 * アップデート関連 URL（system_update_repository のエンドポイント、update.json の
 * download で取得するパッケージ本体URL）のスキーム判定・変換をまとめた純粋関数群。
 *
 * 呼び出し元（UpdateServiceProvider::register() / CheckForUpdate）はグローバル状態
 * （config() / AcmsLogger）に依存するため、そこに判定ロジックを埋めるとテストできない。
 * 判定・変換だけをここに切り出し、ログ発火は各呼び出し元に閉じる。
 */
final class RepositoryUrl
{
    /**
     * @var string
     */
    private const HTTPS_SCHEME = 'https://';

    /**
     * スキームが http（大文字小文字は区別しない）の場合のみ https:// に読み替える。
     *
     * Why not: 前方一致文字列比較（stripos($url, 'http://') === 0）では
     * `http:/host/path`（スラッシュ1個）のようなスキーム区切りの揺れを読み替えられず
     * 平文のまま素通りする（curl はスラッシュを正規化して http:// として解釈してしまうため）。
     * parse_url() の PHP_URL_SCHEME を使えば区切りの揺れに関わらずスキーム自体を判定できる。
     * 判定できた場合は scheme 部分を preg_replace で https:// に置き換える
     * （文字列全体を置換すると、クエリ文字列中の http:// 等意図しない箇所まで書き換えてしまうため）。
     *
     * @param string $url
     * @return string
     */
    public static function enforceHttps(string $url): string
    {
        $scheme = parse_url($url, PHP_URL_SCHEME);
        if (!is_string($scheme) || strtolower($scheme) !== 'http') {
            return $url;
        }

        return (string) preg_replace('#^http:/*#i', self::HTTPS_SCHEME, $url, 1);
    }
}
