<?php
declare(strict_types=1);

/**
 * 本站 uploads/stores 目錄（封面／相簿快取與會員上傳）。
 */
function fate_spa_stores_local_upload_dir(): string
{
    return dirname(__DIR__) . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'stores';
}

/** 前台／後台引用的相對路徑（站台根目錄下）。 */
function fate_spa_stores_local_upload_rel(): string
{
    return 'uploads/stores/';
}

/**
 * 是否為本站 uploads/stores 手動上傳路徑（非 SPA API 遠端 path）。
 */
function fate_is_local_store_upload_path(?string $relativePath): bool
{
    if ($relativePath === null) {
        return false;
    }
    $p = trim(str_replace('\\', '/', $relativePath));
    if ($p === '' || preg_match('#^https?://#i', $p) === 1) {
        return false;
    }

    return preg_match('#^/?uploads/stores/[^/]+$#i', $p) === 1;
}

/**
 * 產生 uploads/stores 相對網址（$webRootPrefix 預設 ./ 供站台根；論壇子目錄請傳 ../）。
 */
function fate_store_upload_web_url(string $filename, string $webRootPrefix = './'): string
{
    $prefix = rtrim($webRootPrefix, '/');
    if ($prefix !== '' && !str_ends_with($prefix, '/')) {
        $prefix .= '/';
    }

    return $prefix . 'uploads/stores/' . basename($filename);
}

/**
 * 新手村靜態資源／頁面連結（封面、相簿 path 多為相對於 spa 根目錄）。
 *
 * @param string $webRootPrefix 相對網址前綴：站台根 ./、論壇 ../
 */
function fate_spa_asset_url(?string $relativePath, string $webRootPrefix = './'): ?string
{
    if ($relativePath === null) {
        return null;
    }
    $p = trim($relativePath);
    if ($p === '') {
        return null;
    }
    if (preg_match('#^https?://#i', $p) === 1) {
        return $p;
    }

    $filename = basename($p);
    $localPath = fate_spa_stores_local_upload_dir() . DIRECTORY_SEPARATOR . $filename;

    if (is_file($localPath)) {
        return fate_store_upload_web_url($filename, $webRootPrefix);
    }

    return FATE_SPA_API_BASE . '/' . ltrim(str_replace('\\', '/', $p), '/');
}

/** 一律指向新手村 CDN／API 的原始圖片 URL（供圖片同步下載）。 */
function fate_spa_asset_remote_url(?string $relativePath): ?string
{
    if ($relativePath === null) {
        return null;
    }
    $p = trim(str_replace('\\', '/', $relativePath));
    if ($p === '' || preg_match('#^https?://#i', $p) === 1) {
        return null;
    }
    if (!defined('FATE_SPA_API_BASE')) {
        require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'app.php';
    }

    return FATE_SPA_API_BASE . '/' . ltrim($p, '/');
}

/**
 * 產生本地緩存圖片網址
 *
 * @param string $webRootPrefix 相對網址前綴：站台根 ./、論壇 ../
 */
function fate_local_asset_url(?string $relativePath, string $webRootPrefix = './'): ?string
{
    if ($relativePath === null) {
        return null;
    }
    $p = trim($relativePath);
    if ($p === '') {
        return null;
    }

    $filename = basename($p);
    $localPath = fate_spa_stores_local_upload_dir() . DIRECTORY_SEPARATOR . $filename;

    if (is_file($localPath)) {
        return fate_store_upload_web_url($filename, $webRootPrefix);
    }

    return fate_store_upload_web_url('placeholder.jpg', $webRootPrefix);
}

function fate_spa_site_url(string $pathOrQuery): string
{
    $p = trim(str_replace('\\', '/', $pathOrQuery));
    if ($p === '') {
        return FATE_SPA_API_BASE . '/';
    }
    return FATE_SPA_API_BASE . '/' . ltrim($p, '/');
}

/**
 * @return array{path:?string,alt:string}
 */
function fate_store_cover_src(?string $coverPhotoPath, ?string $photosJson): array
{
    $path = null;
    if ($coverPhotoPath !== null && trim($coverPhotoPath) !== '') {
        $path = trim($coverPhotoPath);
    } elseif ($photosJson !== null && $photosJson !== '') {
        try {
            $arr = json_decode($photosJson, true, 8, JSON_THROW_ON_ERROR);
            if (is_array($arr)) {
                foreach ($arr as $item) {
                    if (!is_array($item)) {
                        continue;
                    }
                    $pp = isset($item['path']) ? trim((string) $item['path']) : '';
                    if ($pp !== '') {
                        $path = $pp;
                        break;
                    }
                }
            }
        } catch (Throwable $e) {
            $path = null;
        }
    }
    return ['path' => $path !== null && $path !== '' ? $path : null, 'alt' => ''];
}

/**
 * 相簿 paths（供詳情頁橫列縮圖），順序與 API photos[] 相同。
 *
 * @return list<string>
 */
function fate_store_photo_paths(?string $photosJson, int $limit = 24): array
{
    if ($photosJson === null || $photosJson === '') {
        return [];
    }
    $limit = max(1, min(48, $limit));
    try {
        $arr = json_decode($photosJson, true, 16, JSON_THROW_ON_ERROR);
        if (!is_array($arr)) {
            return [];
        }
        $out = [];
        foreach ($arr as $item) {
            if (!is_array($item)) {
                continue;
            }
            $pp = isset($item['path']) ? trim((string) $item['path']) : '';
            if ($pp !== '') {
                $out[] = $pp;
            }
            if (count($out) >= $limit) {
                break;
            }
        }

        return $out;
    } catch (Throwable) {
        return [];
    }
}
