<?php

use App\Livewire\Dashboard\Index as DashboardIndex;

/* API Logs */
use App\Livewire\ApiLogs\Index as ApiLogsIndex;

/* Clientes */
use App\Livewire\Clients\{
    Index as ClientsIndex,
    Create as ClientsCreate,
    Edit as ClientsEdit,
    Show as ClientsShow,
};

/* Licencias */
use App\Livewire\LicenseTokens\{
    Index as LicenseTokensIndex,
    Create as LicenseTokensCreate,
    Edit as LicenseTokensEdit,
    Show as LicenseTokensShow,
    ManageEnvironments as LicenseTokensManageEnvironments,
    AssociateLicense as LicenseTokensAssociateLicense,
    CreateWizard as LicenseTokensCreateWizard,
};

/* Entornos */
use App\Livewire\Environments\{
    Index as EnvironmentsIndex,
    Create as EnvironmentsCreate,
    Edit as EnvironmentsEdit,
    CreateWizard as EnvironmentsCreateWizard,
    CreateFromClient as EnvironmentsCreateFromClient,
};
use App\Livewire\Environments\Components\Success as EnvironmentsSuccess;
use App\Livewire\Environments\Plugins\Index as EnvironmentPluginsIndex;

/* Soportes */
use App\Livewire\Supports\{
    Index as SupportsIndex,
    Create as SupportsCreate,
    Edit as SupportsEdit,
};

/* Productos */
use App\Livewire\Products\{
    Index as ProductsIndex,
    Create as ProductsCreate,
    Edit as ProductsEdit,
    Show as ProductsShow,
};

/* Plugins (vista global) */
use App\Livewire\Plugins\Index as GlobalPluginsIndex;

/* Usuarios */
use App\Livewire\Users\{
    Index as UsersIndex,
    Create as UsersCreate,
    Edit as UsersEdit,
};

/* Setups */
use App\Livewire\Setups\{
    Index as SetupsIndex,
    Create as SetupsCreate,
    Edit as SetupsEdit,
    Show as SetupsShow,
};

/* Features */
use App\Livewire\Features\{
    Index as FeaturesIndex,
    Create as FeaturesCreate,
    Edit as FeaturesEdit,
    VersionShow as FeaturesVersionShow,
    VersionCreate as FeaturesVersionCreate,
    VersionEdit as FeaturesVersionEdit,
};

/* Tutoriales */
use App\Livewire\Tutorials\{
    Index as TutorialsIndex,
    Create as TutorialsCreate,
    Edit as TutorialsEdit,
    VersionShow as TutorialsVersionShow,
    VersionCreate as TutorialsVersionCreate,
    VersionEdit as TutorialsVersionEdit,
};

/* Recursos */
use App\Livewire\Resources\{
    Index as ResourcesIndex,
    Create as ResourcesCreate,
    Edit as ResourcesEdit,
    VersionShow as ResourcesVersionShow,
    VersionCreate as ResourcesVersionCreate,
    VersionEdit as ResourcesVersionEdit,
};

/* SCSS */
use App\Livewire\Scss\{
    Index as ScssIndex,
    Create as ScssCreate,
    Edit as ScssEdit,
    Show as ScssShow,
    VersionShow as ScssVersionShow,
    VersionEdit as ScssVersionEdit,
    FileUpload as ScssFileUpload,
};

/* JS */
use App\Livewire\Js\{
    Index as JsIndex,
    Create as JsCreate,
    Edit as JsEdit,
    Show as JsShow,
    VersionShow as JsVersionShow,
    VersionEdit as JsVersionEdit,
    FileUpload as JsFileUpload,
};

/* SCSS CDN */
use App\Livewire\ScssCdn\{
    Index as ScssCdnIndex,
    BundleCreate as ScssCdnBundleCreate,
    BundleEdit as ScssCdnBundleEdit,
    BundleShow as ScssCdnBundleShow,
    ZipUpload as ScssCdnZipUpload,
    FileEdit as ScssCdnFileEdit,
};

/* CONFIGURACIONES ENVIRONMENTS  */
use App\Livewire\Configurations\Environments\{
    Index as ConfigurationsEnvironmentsTypesIndex,
    Create as ConfigurationsEnvironmentsTypesCreate,
    Edit as ConfigurationsEnvironmentsTypesEdit,
};

/* CONFIGURACIONES ROLES */
use App\Livewire\Configurations\Roles\{
    Index as ConfigurationsRolesIndex,
    Create as ConfigurationsRolesCreate,
    Edit as ConfigurationsRolesEdit,
};

/* CONFIGURACIONES PERMISOS */
use App\Livewire\Configurations\Permissions\{
    Index as ConfigurationsPermissionsIndex,
    Edit as ConfigurationsPermissionsEdit,
};

/* CONFIGURACIONES PRODUCTOS */
use App\Livewire\Configurations\Products\{
    Index as ConfigurationsProductsIndex,
    Create as ConfigurationsProductsCreate,
    Edit as ConfigurationsProductsEdit,
};

/* Rutas */
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;

Route::get('/', function(){
    return redirect()->route('dashboard');
});

Route::view('profile', 'profile')
    ->middleware(['auth'])
    ->name('profile');

Route::middleware(['auth'])->group(function () {

    // Upload de imágenes para Features (ruta web para usar sesión + CSRF)
    Route::post('/api/features/upload-image', [\App\Http\Controllers\Features\ImageUploadController::class, 'upload'])
        ->middleware(['permission:admin.features.create|admin.features.edit']);

    // Dashboard
    Route::middleware(['permission:admin.dashboard.index'])->group(function () {
        Route::get('/dashboard', DashboardIndex::class)->name('dashboard');
    });

    // API Logs (Monitorización)
    Route::middleware(['permission:admin.api-logs.index'])->group(function () {
        Route::get('/api-logs', ApiLogsIndex::class)->name('api-logs.index');
    });

    // Usuarios
    Route::middleware(['permission:admin.users.index'])->group(function () {
        Route::group(['prefix' => 'users'], function () {
            Route::get('/', UsersIndex::class)->name('users.index');
            Route::middleware(['permission:admin.users.create'])->group(function () {
                Route::get('/create', UsersCreate::class)->name('users.create');
            });
            Route::middleware(['permission:admin.users.edit'])->group(function () {
                Route::get('/{user}/edit', UsersEdit::class)->name('users.edit');
            });
        });
    });

    // Entornos
    Route::middleware(['permission:admin.environments.index'])->group(function () {
        Route::group(['prefix' => 'environments'], function () {
            Route::get('/', EnvironmentsIndex::class)->name('environments.index');
            Route::middleware(['permission:admin.environments.create'])->group(function () {
                Route::get('/create', EnvironmentsCreateWizard::class)->name('environments.create');
                Route::get('/clients/{client}/create', EnvironmentsCreateFromClient::class)->name('environments.create-from-client');
            });
            Route::get('/{environment}/success', EnvironmentsSuccess::class)->name('environments.success');
            Route::middleware(['permission:admin.environments.edit'])->group(function () {
                Route::get('/{environment}/edit', EnvironmentsEdit::class)->name('environments.edit');
            });
            Route::get('/{environment}/plugins', EnvironmentPluginsIndex::class)
                ->middleware(['permission:admin.environments.index'])
                ->name('environments.plugins.index');
        });
    });

    // Clientes
    Route::middleware(['permission:admin.clients.index'])->group(function () {
        Route::group(['prefix' => 'clients'], function () {
            Route::get('/', ClientsIndex::class)->name('clients.index');
            Route::middleware(['permission:admin.clients.create'])->group(function () {
                Route::get('/create', ClientsCreate::class)->name('clients.create');
            });
            Route::get('/{client}', ClientsShow::class)->name('clients.show');
            Route::middleware(['permission:admin.clients.edit'])->group(function () {
                Route::get('/{client}/edit', ClientsEdit::class)->name('clients.edit');
            });
        });
    });

    // Tipo de Soporte
    Route::middleware(['permission:admin.supports.index'])->group(function () {
        Route::group(['prefix' => 'supports'], function () {
            Route::get('/', SupportsIndex::class)->name('supports.index');
            Route::middleware(['permission:admin.supports.create'])->group(function () {
                Route::get('/create', SupportsCreate::class)->name('supports.create');
            });
            Route::middleware(['permission:admin.supports.edit'])->group(function () {
                Route::get('/{support}/edit', SupportsEdit::class)->name('supports.edit');
            });
        });
    });

    // Configuraciones
    Route::group(['prefix' => 'configurations'], function () {
        Route::middleware(['permission:admin.configurations.environments-types.index'])->group(function () {
            Route::group(['prefix' => 'environments-types'], function () {
                Route::get('/', ConfigurationsEnvironmentsTypesIndex::class)->name('configurations.environments-types.index');
                Route::middleware(['permission:admin.configurations.environments-types.create'])->group(function () {
                    Route::get('/create', ConfigurationsEnvironmentsTypesCreate::class)->name('configurations.environments-types.create');
                });
                Route::middleware(['permission:admin.configurations.environments-types.edit'])->group(function () {
                    Route::get('/{type}/edit', ConfigurationsEnvironmentsTypesEdit::class)->name('configurations.environments-types.edit');
                });
            });
        });
        Route::middleware(['permission:admin.roles.index'])->group(function () {
            Route::group(['prefix' => 'roles'], function () {
                Route::get('/', ConfigurationsRolesIndex::class)->name('configurations.roles.index');
                Route::middleware(['permission:admin.roles.create'])->group(function () {
                    Route::get('/create', ConfigurationsRolesCreate::class)->name('configurations.roles.create');
                });
                Route::middleware(['permission:admin.roles.edit'])->group(function () {
                    Route::get('/{role}/edit', ConfigurationsRolesEdit::class)->name('configurations.roles.edit');
                });
            });
        });
        Route::middleware(['permission:admin.permissions.index'])->group(function () {
            Route::group(['prefix' => 'permissions'], function () {
                Route::get('/', ConfigurationsPermissionsIndex::class)->name('configurations.permissions.index');
                Route::middleware(['permission:admin.permissions.edit'])->group(function () {
                    Route::get('/{permission}/edit', ConfigurationsPermissionsEdit::class)->name('configurations.permissions.edit');
                });
            });
        });
        Route::middleware(['permission:admin.configurations.products.index'])->group(function () {
            Route::group(['prefix' => 'products'], function () {
                Route::get('/', ConfigurationsProductsIndex::class)->name('configurations.products.index');
                Route::middleware(['permission:admin.configurations.products.create'])->group(function () {
                    Route::get('/create', ConfigurationsProductsCreate::class)->name('configurations.products.create');
                });
                Route::middleware(['permission:admin.configurations.products.edit'])->group(function () {
                    Route::get('/{product}/edit', ConfigurationsProductsEdit::class)->name('configurations.products.edit');
                });
            });
        });
    });

    // Productos
    Route::middleware(['permission:admin.products.index'])->group(function () {
        Route::group(['prefix' => 'products'], function () {
            Route::get('/', ProductsIndex::class)->name('products.index');
            Route::middleware(['permission:admin.products.create'])->group(function () {
                Route::get('/create', ProductsCreate::class)->name('products.create');
            });
            Route::middleware(['permission:admin.products.edit'])->group(function () {
                Route::get('/{product}/edit', ProductsEdit::class)->name('products.edit');
            });
            Route::middleware(['permission:admin.products.show'])->group(function () {
                Route::get('/{product}', ProductsShow::class)->name('products.show');
            });
        });
    });

    // Plugins (vista global)
    Route::get('/plugins', GlobalPluginsIndex::class)
        ->middleware(['permission:admin.environments.index'])
        ->name('plugins.index');

    // Setups anidados bajo productos
    Route::middleware(['permission:admin.setups.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/setups'], function () {
            Route::get('/', SetupsIndex::class)->name('products.setups.index');
            Route::middleware(['permission:admin.setups.create'])->group(function () {
                Route::get('/create', SetupsCreate::class)->name('products.setups.create');
            });
            Route::middleware(['permission:admin.setups.show'])->group(function () {
                Route::get('/{setup}', SetupsShow::class)->name('products.setups.show');
            });
            Route::middleware(['permission:admin.setups.edit'])->group(function () {
                Route::get('/{setup}/edit', SetupsEdit::class)->name('products.setups.edit');
            });
        });
    });

    // Features anidados bajo productos
    Route::middleware(['permission:admin.features.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/features'], function () {
            Route::get('/', FeaturesIndex::class)->name('products.features.index');
            
            // Crear versión
            Route::middleware(['permission:admin.features.version.create'])->group(function () {
                Route::get('/create', FeaturesVersionCreate::class)->name('products.features.version.create');
            });
            
            // Rutas de versiones: products/{product}/features/version/{featureVersion}
            Route::group(['prefix' => 'version/{featureVersion}'], function () {
                Route::middleware(['permission:admin.features.version.show'])->group(function () {
                    Route::get('/', FeaturesVersionShow::class)->name('products.features.version.show');
                });
                Route::middleware(['permission:admin.features.version.edit'])->group(function () {
                    Route::get('/edit', FeaturesVersionEdit::class)->name('products.features.version.edit');
                });
                
                // Rutas de features individuales: products/{product}/features/version/{featureVersion}/feature/{feature}
                Route::group(['prefix' => 'feature/{feature}'], function () {
                    Route::middleware(['permission:admin.features.edit'])->group(function () {
                        Route::get('/edit', FeaturesEdit::class)->name('products.features.edit');
                    });
                });
                
                // Crear feature dentro de una versión
                Route::middleware(['permission:admin.features.create'])->group(function () {
                    Route::get('/feature/create', FeaturesCreate::class)->name('products.features.create');
                });
            });
        });
    });

    // Tutoriales anidados bajo productos
    Route::middleware(['permission:admin.tutorials.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/tutorials'], function () {
            Route::get('/', TutorialsIndex::class)->name('products.tutorials.index');
            
            // Crear versión
            Route::middleware(['permission:admin.tutorials.version.create'])->group(function () {
                Route::get('/create', TutorialsVersionCreate::class)->name('products.tutorials.version.create');
            });
            
            // Rutas de versiones: products/{product}/tutorials/version/{tutorialVersion}
            Route::group(['prefix' => 'version/{tutorialVersion}'], function () {
                Route::middleware(['permission:admin.tutorials.version.show'])->group(function () {
                    Route::get('/', TutorialsVersionShow::class)->name('products.tutorials.version.show');
                });
                Route::middleware(['permission:admin.tutorials.version.edit'])->group(function () {
                    Route::get('/edit', TutorialsVersionEdit::class)->name('products.tutorials.version.edit');
                });
                
                // Rutas de tutoriales individuales: products/{product}/tutorials/version/{tutorialVersion}/tutorial/{tutorial}
                Route::group(['prefix' => 'tutorial/{tutorial}'], function () {
                    Route::middleware(['permission:admin.tutorials.edit'])->group(function () {
                        Route::get('/edit', TutorialsEdit::class)->name('products.tutorials.edit');
                    });
                });
                
                // Crear tutorial dentro de una versión
                Route::middleware(['permission:admin.tutorials.create'])->group(function () {
                    Route::get('/tutorial/create', TutorialsCreate::class)->name('products.tutorials.create');
                });
            });
        });
    });

    // Resources anidados bajo productos
    Route::middleware(['permission:admin.resources.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/resources'], function () {
            Route::get('/', ResourcesIndex::class)->name('products.resources.index');
            
            // Crear versión
            Route::middleware(['permission:admin.resources.version.create'])->group(function () {
                Route::get('/create', ResourcesVersionCreate::class)->name('products.resources.version.create');
            });
            
            // Rutas de versiones: products/{product}/resources/version/{resourceVersion}
            Route::group(['prefix' => 'version/{resourceVersion}'], function () {
                Route::middleware(['permission:admin.resources.version.show'])->group(function () {
                    Route::get('/', ResourcesVersionShow::class)->name('products.resources.version.show');
                });
                Route::middleware(['permission:admin.resources.version.edit'])->group(function () {
                    Route::get('/edit', ResourcesVersionEdit::class)->name('products.resources.version.edit');
                });
                
                // Rutas de recursos individuales: products/{product}/resources/version/{resourceVersion}/resource/{resource}
                Route::group(['prefix' => 'resource/{resource}'], function () {
                    Route::middleware(['permission:admin.resources.edit'])->group(function () {
                        Route::get('/edit', ResourcesEdit::class)->name('products.resources.edit');
                    });
                });
                
                // Crear recurso dentro de una versión
                Route::middleware(['permission:admin.resources.create'])->group(function () {
                    Route::get('/resource/create', ResourcesCreate::class)->name('products.resources.create');
                });
            });
        });
    });

    // LicenceTokens
    Route::middleware(['permission:admin.license-tokens.index'])->group(function () {
        Route::group(['prefix' => 'license_tokens'], function () {
            Route::get('/', LicenseTokensIndex::class)->name('license_tokens.index');
            Route::middleware(['permission:admin.license-tokens.create'])->group(function () {
                Route::get('/create', LicenseTokensCreateWizard::class)->name('license_tokens.create');
            });
            Route::middleware(['permission:admin.license-tokens.edit'])->group(function () {
                Route::get('/{license_token}/edit', LicenseTokensEdit::class)->name('license_tokens.edit');
            });
            Route::middleware(['permission:admin.license-tokens.manage-environments'])->group(function () {
                Route::get('/{license_token}/manage-environments', LicenseTokensManageEnvironments::class)->name('license_tokens.manage-environments');
            });
            Route::middleware(['permission:admin.license-tokens.show'])->group(function () {
                Route::get('/{license_token}', LicenseTokensShow::class)->name('license_tokens.show');
            });
            Route::middleware(['permission:admin.license-tokens.associate-license'])->group(function () {
                Route::get('/{client}/associate-license/{environment?}', LicenseTokensAssociateLicense::class)->name('license_tokens.associate-license');
            });
        });
    });

    // SCSS Versions anidados bajo productos
    Route::middleware(['permission:admin.scss.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/scss'], function () {
            Route::get('/', ScssIndex::class)->name('products.scss.index');
            Route::middleware(['permission:admin.scss.version.show'])->group(function () {
                Route::get('/{scssVersion}', ScssVersionShow::class)->name('products.scss.version.show');
            });
            Route::middleware(['permission:admin.scss.version.edit'])->group(function () {
                Route::get('/{scssVersion}/edit', ScssVersionEdit::class)->name('products.scss.version.edit');
            });
            Route::middleware(['permission:admin.scss.files.upload'])->group(function () {
                Route::get('/{scssVersion}/files/upload', ScssFileUpload::class)->name('products.scss.files.upload');
            });
            Route::middleware(['permission:admin.scss.file.create'])->group(function () {
                Route::get('/{scssVersion}/file/create', ScssCreate::class)->name('products.scss.file.create');
            });
            Route::middleware(['permission:admin.scss.file.show'])->group(function () {
                Route::get('/{scssVersion}/file/{scssFile}', ScssShow::class)->name('products.scss.file.show');
            });
            Route::middleware(['permission:admin.scss.file.edit'])->group(function () {
                Route::get('/{scssVersion}/file/{scssFile}/edit', ScssEdit::class)->name('products.scss.file.edit');
            });
        });
    });

    // JS Versions anidados bajo productos
    Route::middleware(['permission:admin.js.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/js'], function () {
            Route::get('/', JsIndex::class)->name('products.js.index');
            Route::middleware(['permission:admin.js.version.show'])->group(function () {
                Route::get('/{jsVersion}', JsVersionShow::class)->name('products.js.version.show');
            });
            Route::middleware(['permission:admin.js.version.edit'])->group(function () {
                Route::get('/{jsVersion}/edit', JsVersionEdit::class)->name('products.js.version.edit');
            });
            Route::middleware(['permission:admin.js.files.upload'])->group(function () {
                Route::get('/{jsVersion}/files/upload', JsFileUpload::class)->name('products.js.files.upload');
            });
            Route::middleware(['permission:admin.js.file.create'])->group(function () {
                Route::get('/{jsVersion}/file/create', JsCreate::class)->name('products.js.file.create');
            });
            Route::middleware(['permission:admin.js.file.show'])->group(function () {
                Route::get('/{jsVersion}/file/{jsFile}', JsShow::class)->name('products.js.file.show');
            });
            Route::middleware(['permission:admin.js.file.edit'])->group(function () {
                Route::get('/{jsVersion}/file/{jsFile}/edit', JsEdit::class)->name('products.js.file.edit');
            });
        });
    });

    // SCSS CDN Bundles anidados bajo productos
    Route::middleware(['permission:admin.scss-cdn.index'])->group(function () {
        Route::group(['prefix' => 'products/{product}/scss-cdn'], function () {
            Route::get('/', ScssCdnIndex::class)->name('products.scss-cdn.index');
            Route::middleware(['permission:admin.scss-cdn.create'])->group(function () {
                Route::get('/create', ScssCdnBundleCreate::class)->name('products.scss-cdn.create');
            });
            Route::middleware(['permission:admin.scss-cdn.bundle.show'])->group(function () {
                Route::get('/{bundle}', ScssCdnBundleShow::class)->name('products.scss-cdn.bundle.show');
            });
            Route::middleware(['permission:admin.scss-cdn.bundle.edit'])->group(function () {
                Route::get('/{bundle}/edit', ScssCdnBundleEdit::class)->name('products.scss-cdn.bundle.edit');
            });
            Route::middleware(['permission:admin.scss-cdn.bundle.upload'])->group(function () {
                Route::get('/{bundle}/upload', ScssCdnZipUpload::class)->name('products.scss-cdn.bundle.upload');
            });
            Route::middleware(['permission:admin.scss-cdn.file.edit'])->group(function () {
                Route::get('/{bundle}/file/{file}/edit', ScssCdnFileEdit::class)->name('products.scss-cdn.file.edit');
            });
        });
    });

    // Preview de tutoriales (puede ser público o con auth según necesidad)
    Route::get('/tutorials/{tutorial}/preview', [\App\Http\Controllers\Tutorials\PreviewController::class, 'show'])->name('tutorials.preview');

});



require __DIR__.'/auth.php';
