<?php

declare(strict_types=1);

namespace Acms\Services\Storage;

use Acms\Services\Facades\LocalStorage;
use Acms\Services\Facades\PrivateStorage;
use Acms\Services\Facades\PublicStorage;

/**
 * ローカルストレージ判定と、ローカルディレクトリのリモートストレージへのアップロードを担う。
 */
class AssetSynchronizer
{
    /**
     * プライベートストレージの設定がローカルかどうか
     *
     * @return boolean
     */
    public function isLocalPrivateStorage(): bool
    {
        return get_class(LocalStorage::getInstance()) === get_class(PrivateStorage::getInstance());
    }

    /**
     * パブリックストレージの設定がローカルかどうか
     *
     * @return boolean
     */
    public function isLocalPublicStorage(): bool
    {
        return get_class(LocalStorage::getInstance()) === get_class(PublicStorage::getInstance());
    }

    /**
     * ローカルのディレクトリをS3などのリモートストレージにアップロード
     *
     * @param string $from
     * @param string $to
     * @param boolean $isPublic
     * @return void
     */
    public function uploadAssetDirectory(string $from, string $to, bool $isPublic): void
    {
        $uploadStorage = $isPublic ? PublicStorage::getInstance() : PrivateStorage::getInstance();
        if (!LocalStorage::isDirectory($from)) {
            return;
        }
        $uploadStorage->makeDirectory($to);
        $dir = opendir($from);
        if ($dir === false) {
            return;
        }
        while (false !== ($file = readdir($dir))) {
            if ($file !== '.' && $file !== '..') {
                if (LocalStorage::isDirectory($from . '/' . $file)) {
                    $this->uploadAssetDirectory($from . '/' . $file, $to . '/' . $file, $isPublic);
                } elseif ($content =  LocalStorage::get($from . '/' . $file)) {
                    $uploadStorage->put($to . '/' . $file, $content);
                }
            }
        }
        closedir($dir);
    }
}
