<?php
// +----------------------------------------------------------------------
// | onezan-admin 快速开发的管理平台
// +----------------------------------------------------------------------
// | 官方网址：https://www.onezan.cn
// +----------------------------------------------------------------------
// | onezan团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: 543885307@qq.com
// +----------------------------------------------------------------------
namespace app\service\domain\storage\gateway;

use app\service\StorageService;


/**
 * Local Storage Gateway
 * @package app\service\domain\storage\gateway
 */
class LocalStorageGateway extends BaseStorageGateway
{
    /**
     * 上传文件到本地存储
     * @param string $localPath 本地文件路径
     * @param string $remotePath 远程文件路径
     * @param array $options 上传选项
     * @return array 上传结果
     */
    public function upload(string $localPath, string $remotePath, array $options = []): array
    {
        $targetDir = dirname($this->physicalPath($remotePath));
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0755, true);
        }

        $targetPath = $this->physicalPath($remotePath);
        if ($localPath !== $targetPath) {
            copy($localPath, $targetPath);
        }

        return [
            'url' => StorageService::toPublicUrl($remotePath),
            'path' => $remotePath,
        ];
    }

    /**
     * 删除本地存储中的文件
     * @param string $remotePath 远程文件路径
     * @return bool 是否删除成功
     */
    public function delete(string $remotePath): bool
    {
        $targetPath = $this->physicalPath($remotePath);
        if (file_exists($targetPath)) {
            @unlink($targetPath);
            return true;
        }
        return false;
    }

    /**
     * 获取文件的公共访问 URL
     * @param string $remotePath 远程文件路径
     * @param int $expireSeconds 过期时间（秒）
     * @return string 公共访问 URL
     */
    public function url(string $remotePath, int $expireSeconds = 0): string
    {
        return StorageService::toPublicUrl($remotePath);
    }

    /**
     * 获取存储提供程序名称
     * @return string 存储提供程序名称
     */
    public function provider(): string
    {
        return 'local';
    }

    /**
     * 获取存储提供程序名称
     * @return string 存储提供程序名称
     */
    public function name(): string
    {
        return '';
    }

    /**
     * 检查存储提供程序是否已配置
     * @return bool 是否已配置
     */
    public function isConfigured(): bool
    {
        return true;
    }

    /**
     * 获取物理存储路径
     * @param string $remotePath 远程文件路径
     * @return string 物理存储路径
     */
    private function physicalPath(string $remotePath): string
    {
        $normalized = $this->normalizePath($remotePath);
        $root = app()->getRootPath() . 'public' . DIRECTORY_SEPARATOR;
        return $root . $normalized;
    }
}