<?php
namespace filesystem\driver;

use Closure;
use filesystem\adapter\QiniuAdapter;
use League\Flysystem\FilesystemAdapter;

class Qiniu extends \think\filesystem\Driver
{
    protected function createAdapter(): FilesystemAdapter
    {
        return new QiniuAdapter(
            $this->config['access_key'],
            $this->config['secret_key'],
            $this->config['bucket'],
            $this->config['base_url'],
            $this->config['path_prefix']
        );
    }

    /**
     * 保存文件
     * @param string $path 路径
     * @param \think\File $file 文件
     * @param null|string|\Closure $rule 文件名规则
     * @param array $options 参数
     * @return bool|string
     */
    public function putFile(string $path, \think\File $file, $rule = null, array $options = [])
    {
        if (!empty($this->config['filename_generator']) && $this->config['filename_generator'] instanceof Closure) {
            $rule = $this->config['filename_generator']($file, $rule);
        }
        
        return $this->putFileAs($path, $file, $file->hashName($rule), $options);
    }

    public function url(string $path): string
    {
        if (str_starts_with($path, 'http://') || str_starts_with($path, 'https://')) {
            return $path;
        }
        if (!str_starts_with($path, $this->config['path_prefix'])) {
            $path = $this->config['path_prefix'] . '/' . $path;
        }
        return $this->concatPathToUrl($this->config['base_url'], $path);
    }

    public function path(string $path): string
    {
        if (!str_starts_with($path, $this->config['path_prefix'])) {
            $path = $this->config['path_prefix'] . '/' . $path;
        }
        return $path;
    }
}
