<?php

namespace FlysystemOffload\Config;

class ConfigLoader
{
    private string $pluginDir;

    public function __construct(string $pluginFile)
    {
        $this->pluginDir = dirname($pluginFile);
    }

    /**
     * Devuelve la configuración efectiva (defaults + overrides).
     *
     * @throws \RuntimeException cuando un archivo config no retorna array.
     */
    public function load(): array
    {
        $defaults = $this->defaults();
        $files    = $this->discoverConfigFiles();

        $config = [];

        foreach ($files as $file) {
            $data = require $file;

            if (! is_array($data)) {
                throw new \RuntimeException(
                    sprintf('[Flysystem Offload] El archivo de configuración "%s" debe retornar un array.', $file)
                );
            }

            $config = array_replace_recursive($config, $data);
        }

        if (empty($config)) {
            $config = $defaults;
        } else {
            $config = array_replace_recursive($defaults, $config);
        }

        /**
         * Permite ajustar/ensanchar la configuración en tiempo de ejecución.
         * Ideal para multisite o integraciones externas.
         *
         * @param array $config
         * @param array $files  Lista de archivos usados (en orden de carga).
         */
        return apply_filters('flysystem_offload_config', $config, $files);
    }

    /**
     * Defaults que garantizan compatibilidad si falta un archivo.
     */
    public function defaults(): array
    {
        return [
            'adapter'     => 'local',
            'base_prefix' => '',
            'adapters'    => [
                's3' => [
                    'access_key' => '',
                    'secret_key' => '',
                    'region'     => '',
                    'bucket'     => '',
                    'prefix'     => '',
                    'endpoint'   => '',
                    'cdn_url'    => '',
                ],
                'sftp' => [
                    'host'     => '',
                    'port'     => 22,
                    'username' => '',
                    'password' => '',
                    'root'     => '/uploads',
                ],
                'gcs' => [
                    'project_id'    => '',
                    'bucket'        => '',
                    'key_file_path' => '',
                ],
                'azure' => [
                    'account_name' => '',
                    'account_key'  => '',
                    'container'    => '',
                    'prefix'       => '',
                ],
                'webdav' => [
                    'base_uri'   => '',
                    'username'   => '',
                    'password'   => '',
                    'path_prefix'=> '',
                ],
                'googledrive' => [],
                'onedrive'    => [],
                'dropbox'     => [],
            ],
        ];
    }

    /**
     * Descubre archivos de configuración en orden de prioridad.
     *
     * @return string[]
     */
    private function discoverConfigFiles(): array
    {
        $candidates = [];

        if (defined('FLYSYSTEM_OFFLOAD_CONFIG')) {
            $candidates[] = FLYSYSTEM_OFFLOAD_CONFIG;
        }

        // Opción por defecto en wp-content/.
        $candidates[] = WP_CONTENT_DIR . '/flysystem-offload.php';

        // Alias alternativo frecuente.
        $candidates[] = WP_CONTENT_DIR . '/flysystem-offload-config.php';

        // Fallback incluido dentro del plugin (para entornos sin personalización inicial).
        $candidates[] = $this->pluginDir . '/config/flysystem-offload.php';

        $unique = array_unique(array_filter(
            $candidates,
            static fn (string $path) => is_readable($path)
        ));

        return array_values($unique);
    }
}
