<?php

namespace Illuminate\Filesystem;

use Illuminate\Support\ServiceProvider;
// namespace
class FilesystemServiceProvider extends ServiceProvider
{// File system Service Provider extends Service Provider
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerNativeFilesystem();// register

        $this->registerFlysystem();// register Fly system
    }// register the service provider

    /**
     * Register the native filesystem implementation.
     *
     * @return void
     */
    protected function registerNativeFilesystem()
    {
        $this->app->singleton('files', function () {
            return new Filesystem;
        });
    }// register a singleton files, get a instance about filesystem

    /**
     * Register the driver based filesystem.
     *
     * @return void
     */
    protected function registerFlysystem()
    {
        $this->registerManager();// first register Manager

        $this->app->singleton('filesystem.disk', function () {
            return $this->app['filesystem']->disk($this->getDefaultDriver());
        });// if it is a disk, get the Default Driver

        $this->app->singleton('filesystem.cloud', function () {
            return $this->app['filesystem']->disk($this->getCloudDriver());
        });//else set the Get Cloud Driver
    }//register the driver based filesystem

    /**
     * Register the filesystem manager.
     *
     * @return void
     */
    protected function registerManager()
    {
        $this->app->singleton('filesystem', function () {
            return new FilesystemManager($this->app);
        });// get a singleton filesystem use a new FilesystemManager
    }// register Manager

    /**
     * Get the default file driver.
     *
     * @return string
     */
    protected function getDefaultDriver()
    {
        return $this->app['config']['filesystems.default'];
    }// get Default Driver more use a config array

    /**
     * Get the default cloud based file driver.
     *
     * @return string
     */
    protected function getCloudDriver()
    {
        return $this->app['config']['filesystems.cloud'];
    }// get the Cloud Driver
}