<?php

namespace Symfony\Config\Flysystem\StorageConfig;

use Symfony\Component\Config\Loader\ParamConfigurator;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;

/**
 * This class is automatically generated to help in creating a config.
 */
class GridfsConfig 
{
    private $bucket;
    private $prefix;
    private $database;
    private $doctrineConnection;
    private $mongodbUri;
    private $mongodbUriOptions;
    private $mongodbDriverOptions;
    private $_usedProperties = [];

    /**
     * GridFS bucket service name (if using an existing bucket service)
     * @default null
     * @param ParamConfigurator|mixed $value
     * @return $this
     */
    public function bucket($value): static
    {
        $this->_usedProperties['bucket'] = true;
        $this->bucket = $value;

        return $this;
    }

    /**
     * Optional path prefix to prepend to all file names
     * @param ParamConfigurator|mixed $value
     * @return $this
     */
    public function prefix($value): static
    {
        $this->_usedProperties['prefix'] = true;
        $this->prefix = $value;

        return $this;
    }

    /**
     * MongoDB database name
     * @default null
     * @param ParamConfigurator|mixed $value
     * @return $this
     */
    public function database($value): static
    {
        $this->_usedProperties['database'] = true;
        $this->database = $value;

        return $this;
    }

    /**
     * Doctrine MongoDB connection name (mutually exclusive with mongodb_uri)
     * @default null
     * @param ParamConfigurator|mixed $value
     * @return $this
     */
    public function doctrineConnection($value): static
    {
        $this->_usedProperties['doctrineConnection'] = true;
        $this->doctrineConnection = $value;

        return $this;
    }

    /**
     * MongoDB connection URI (mutually exclusive with doctrine_connection)
     * @default null
     * @param ParamConfigurator|mixed $value
     * @return $this
     */
    public function mongodbUri($value): static
    {
        $this->_usedProperties['mongodbUri'] = true;
        $this->mongodbUri = $value;

        return $this;
    }

    /**
     * @param ParamConfigurator|list<ParamConfigurator|mixed> $value
     *
     * @return $this
     */
    public function mongodbUriOptions(ParamConfigurator|array $value): static
    {
        $this->_usedProperties['mongodbUriOptions'] = true;
        $this->mongodbUriOptions = $value;

        return $this;
    }

    /**
     * @param ParamConfigurator|list<ParamConfigurator|mixed> $value
     *
     * @return $this
     */
    public function mongodbDriverOptions(ParamConfigurator|array $value): static
    {
        $this->_usedProperties['mongodbDriverOptions'] = true;
        $this->mongodbDriverOptions = $value;

        return $this;
    }

    public function __construct(array $config = [])
    {
        if (array_key_exists('bucket', $config)) {
            $this->_usedProperties['bucket'] = true;
            $this->bucket = $config['bucket'];
            unset($config['bucket']);
        }

        if (array_key_exists('prefix', $config)) {
            $this->_usedProperties['prefix'] = true;
            $this->prefix = $config['prefix'];
            unset($config['prefix']);
        }

        if (array_key_exists('database', $config)) {
            $this->_usedProperties['database'] = true;
            $this->database = $config['database'];
            unset($config['database']);
        }

        if (array_key_exists('doctrine_connection', $config)) {
            $this->_usedProperties['doctrineConnection'] = true;
            $this->doctrineConnection = $config['doctrine_connection'];
            unset($config['doctrine_connection']);
        }

        if (array_key_exists('mongodb_uri', $config)) {
            $this->_usedProperties['mongodbUri'] = true;
            $this->mongodbUri = $config['mongodb_uri'];
            unset($config['mongodb_uri']);
        }

        if (array_key_exists('mongodb_uri_options', $config)) {
            $this->_usedProperties['mongodbUriOptions'] = true;
            $this->mongodbUriOptions = $config['mongodb_uri_options'];
            unset($config['mongodb_uri_options']);
        }

        if (array_key_exists('mongodb_driver_options', $config)) {
            $this->_usedProperties['mongodbDriverOptions'] = true;
            $this->mongodbDriverOptions = $config['mongodb_driver_options'];
            unset($config['mongodb_driver_options']);
        }

        if ($config) {
            throw new InvalidConfigurationException(sprintf('The following keys are not supported by "%s": ', __CLASS__).implode(', ', array_keys($config)));
        }
    }

    public function toArray(): array
    {
        $output = [];
        if (isset($this->_usedProperties['bucket'])) {
            $output['bucket'] = $this->bucket;
        }
        if (isset($this->_usedProperties['prefix'])) {
            $output['prefix'] = $this->prefix;
        }
        if (isset($this->_usedProperties['database'])) {
            $output['database'] = $this->database;
        }
        if (isset($this->_usedProperties['doctrineConnection'])) {
            $output['doctrine_connection'] = $this->doctrineConnection;
        }
        if (isset($this->_usedProperties['mongodbUri'])) {
            $output['mongodb_uri'] = $this->mongodbUri;
        }
        if (isset($this->_usedProperties['mongodbUriOptions'])) {
            $output['mongodb_uri_options'] = $this->mongodbUriOptions;
        }
        if (isset($this->_usedProperties['mongodbDriverOptions'])) {
            $output['mongodb_driver_options'] = $this->mongodbDriverOptions;
        }

        return $output;
    }

}
