<?php

use App\Http\Controllers\Administration\AdministrationController;
use App\Http\Controllers\Administration\ConsolidationController;
use App\Http\Controllers\BibliothequeProjetController;
use App\Http\Controllers\Cartograhie\CartographieController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\NotificationController;
use App\Http\Controllers\PaatController;
use App\Http\Controllers\Parametres\ActionController;
use App\Http\Controllers\Parametres\AlerteController;
use App\Http\Controllers\Parametres\CategorieController;
use App\Http\Controllers\Parametres\DirectionController;
use App\Http\Controllers\Parametres\DomaineController;
use App\Http\Controllers\Parametres\FamilleController;
use App\Http\Controllers\Parametres\Imports\ImportCartographie;
use App\Http\Controllers\Parametres\Imports\ImportNomenclatureController;
use App\Http\Controllers\Parametres\Imports\ImportProjetController;
use App\Http\Controllers\Parametres\ImputationBudgetaireController;
use App\Http\Controllers\Parametres\LevierController;
use App\Http\Controllers\Parametres\NiveauMutualisationController;
use App\Http\Controllers\Parametres\OperateurMutualisationController;
use App\Http\Controllers\Parametres\PortefeuilleAcheteurController;
use App\Http\Controllers\Parametres\PortefeuilleResponsableAchatController;
use App\Http\Controllers\Parametres\RespSocEnvController;
use App\Http\Controllers\Parametres\SegmentController;
use App\Http\Controllers\Parametres\ServiceController;
use App\Http\Controllers\Parametres\StructureController;
use App\Http\Controllers\Parametres\ThematiqueController;
use App\Http\Controllers\Projets\FichierController;
use App\Http\Controllers\Projets\PlanificationController;
use App\Http\Controllers\Projets\ProjetController;
use App\Http\Controllers\Projets\TacheController;
use App\Http\Controllers\UtilisateurController;
use App\Http\Controllers\WelcomeController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

// Formulaire de contact et de demo
Route::post('/demande-demonstration', [WelcomeController::class, 'demonstration'])->name('welcome.demo');
Route::post('/demande-contact', [WelcomeController::class, 'contact'])->name('welcome.contact');

Auth::routes(['register' => false]);
Auth::routes(['verify' => true]);

Route::middleware(['auth', 'verified', 'admin:false'])->group(function () {
    Route::get('/home', [HomeController::class, 'index'])->name('home');
    Route::get('/home/refresh', [HomeController::class, 'refresh_table'])->name('home.refresh_table');

    // Projets
    Route::resource('projets', ProjetController::class)->except('show');
    Route::put('projets/{id}/edit/update_achats_simples', [ ProjetController::class, 'update_achats_simples' ])->name('projets.update_achats_simples');
    Route::put('projets/{id}/edit/update_achats_complexes', [ ProjetController::class, 'update_achats_complexes' ])->name('projets.update_achats_complexes');
    Route::put('projets/{id}/edit/update_achats_complexes_dgos', [ ProjetController::class, 'update_achats_complexes_dgos' ])->name('projets.update_achats_complexes_dgos');
    Route::put('projets/{id}/edit/update_achats_investissements', [ ProjetController::class, 'update_achats_investissements' ])->name('projets.update_achats_investissements');
    Route::put('projets/{id}/edit/update_statuts', [ ProjetController::class, 'update_statuts' ])->name('projets.update_statuts');
    Route::put('projets/{id}/edit/update_leviers', [ ProjetController::class, 'update_leviers' ])->name('projets.update_leviers');
    Route::put('projets/{id}/edit/ajouter-membre/', [ProjetController::class, 'ajouter_membre'])->name('projets.ajouter-membre');
    Route::delete('projets/{id}/edit/{user_id}/supprimer-membre/', [ProjetController::class, 'supprimer_membre'])->name('projets.supprimer-membre');
    Route::put('projets/{id}/edit/update-resp-soc-env/', [ProjetController::class, 'update_resp_soc_env'])->name('projets.update-resp-soc-env');
    Route::put('projets/{id}/edit/update-suivi/', [ProjetController::class, 'update_suivi'])->name('projets.update-suivi');
    Route::post('projets/recherche', [ProjetController::class, 'recherche'])->name('projets.recherche');
    Route::post('projets/filtres', [ProjetController::class, 'filtres'])->name('projets.filtres');
    Route::post('projets/dupliquer/{id}', [ProjetController::class, 'dupliquer'])->name('projets.dupliquer');

    Route::prefix('projets/{id}/edit')->group(function () {
        // Tâches gestion projet
        Route::resource('taches', TacheController::class)->except('index', 'show');

        // Fichiers
        Route::resource('fichiers', FichierController::class)->except('index', 'show');
        Route::get('fichiers/{fichier_id}/download', [FichierController::class, 'download'])->name('fichiers.download');

        // Planification
        Route::resource('planification', PlanificationController::class)->only('store');
    });

    // Paramètres
    Route::prefix('parametres')->group(function () {
        // Familles, Domaines, Catégories et Segments
        Route::resource('familles', FamilleController::class)->except('show');
        Route::prefix('familles/{famille_id}')->group(function () {
            Route::resource('domaines', DomaineController::class)->except('show');

            Route::prefix('domaines/{domaine_id}')->group(function () {
                Route::resource('categories', CategorieController::class)->except('show');

                Route::prefix('categories/{categorie_id}')->group(function () {
                    Route::resource('segments', SegmentController::class)->except('show');
                });
            });
        });

        // Leviers
        Route::resource('leviers', LevierController::class)->except('show');

        // Imputations budgétaires
        Route::resource('imputations-budgetaires', ImputationBudgetaireController::class)->except('show');

        // Niveaux de mutualisation
        Route::resource('niveaux-mutualisations', NiveauMutualisationController::class)->except('show');

        // Opérateurs de mutualisations
        Route::resource('operateurs-mutualisations', OperateurMutualisationController::class)->except('show');

        // Portefeuilles responsables achats, portefeuilles acheteurs
        Route::resource('portefeuilles-responsables-achats', PortefeuilleResponsableAchatController::class)->except('show');
        Route::prefix('portefeuilles-responsables-achats/{portefeuille_resp_achat_id}')->group(function () {
            Route::resource('portefeuilles-acheteurs', PortefeuilleAcheteurController::class)->except('show');
        });

        // Import Cartographie
        Route::resource('import-cartographie', ImportCartographie::class)->except('show');
        Route::post('/import-cartographie/matchingCSV', [ImportCartographie::class, 'matchingCSV'])->name('import-cartographie.matchingCSV');
        Route::get('/import-cartographie/matchingCSV', [ImportCartographie::class, 'matchingCSV'])->name('import-cartographie.getMatchingCSV');

        // Directions et services
        Route::resource('directions', DirectionController::class)->except('show');
        Route::prefix('directions/{direction_id}')->group(function () {
            Route::resource('services', ServiceController::class)->except('show');
        });

        // Thématiques et actions
        Route::resource('thematiques', ThematiqueController::class)->except('show');
        Route::prefix('thematiques/{thematique_id}')->group(function () {
            Route::resource('actions', ActionController::class)->except('show');
        });

        // Resp.Soc.env
        Route::get('resp-soc-env', [RespSocEnvController::class, 'index'])->name('resp-soc-env.index');
        Route::put('resp-soc-env', [RespSocEnvController::class, 'update'])->name('resp-soc-env.update');
        Route::get('action-unite-oeuvre/create', [RespSocEnvController::class, 'action_unite_oeuvre_create'])->name('action_unite_oeuvre.create');
        Route::post('action-unite-oeuvre', [RespSocEnvController::class, 'action_unite_oeuvre_store'])->name('action_unite_oeuvre.store');
        Route::get('action-unite-oeuvre/{id}/edit', [RespSocEnvController::class, 'action_unite_oeuvre_edit'])->name('action_unite_oeuvre.edit');
        Route::put('action-unite-oeuvre/{id}', [RespSocEnvController::class, 'action_unite_oeuvre_update'])->name('action_unite_oeuvre.update');
        Route::delete('action-unite-oeuvre/{id}', [RespSocEnvController::class, 'action_unite_oeuvre_destroy'])->name('action_unite_oeuvre.destroy');

        // Alertes
        Route::resource('alertes', AlerteController::class)->except('show');

        // Structure
        Route::resource('structure', StructureController::class)->only(['index', 'update']);
        Route::post('structure/{id}/changer-logo', [StructureController::class, 'changer_logo'])->name('structure.changer-logo');

        // Import nomenclature
        if (env('APTIMAP_CONFIG_ORDIGES', false))
        {
            Route::group(['middleware' => ['can:importer_parametre']], function () {
                Route::get('import-nomenclature', [ImportNomenclatureController::class, 'index'])->name('import-nomenclature.index');
                Route::post('import-nomenclature', [ImportNomenclatureController::class, 'store'])
                    ->middleware(['throttle:import-nomenclature'])
                    ->name('import-nomenclature.store');

                Route::get('import-projet', [ImportProjetController::class, 'index'])->name('import-projet.index');
                Route::post('import-projet', [ImportProjetController::class, 'store'])
                    ->middleware(['throttle:import-projet'])
                    ->name('import-projet.store');
            });
        }
    });

    // Utilisateurs
    Route::resource('utilisateurs', UtilisateurController::class)->except('show');
    Route::put('utilisateurs/{id}/active', [UtilisateurController::class, 'active'])->name('utilisateurs.active');

    // PAATs
    Route::resource('paats', PaatController::class);
    Route::put('paats/{id}/validate', [PaatController::class, 'valider'])->name('paats.validate');
    Route::put('paats/{id}/cloture', [PaatController::class, 'cloturer'])->name('paats.cloture');
    Route::delete('paats/{paat_id}/supprime-projet/{projet_id}', [PaatController::class, 'delete_projet'])->name('paats.delete_projet');

    // Cartographie
    Route::get('/cartographie', [CartographieController::class, 'index'])->name('cartographie.index');
    Route::post('/cartographie', [CartographieController::class, 'index'])->name('cartographie.index');
    Route::post('/cartographie/check', [CartographieController::class, 'check'])->name('cartographie.check');
    Route::get('/cartographie/check', [CartographieController::class, 'check'])->name('cartographie.check');

    // Notifications
    Route::put('notifications/{notification}', [NotificationController::class, 'update'])->name('notifications.update');
    Route::put('notifications', [NotificationController::class, 'update_all'])->name('notifications.update_all');
    Route::post('notifications', [NotificationController::class, 'markAsRead'])->name('notifications.markAsRead');

    // Home
    Route::post('home/filtres', [HomeController::class, 'filtres'])->name(('home.filtres'));
    Route::get('home/export_paats_resp_ars', [HomeController::class, 'export_paats_resp_ars'])->name(('home.export_paats_resp_ars'));
    Route::put('home/save_export_pdf', [HomeController::class, 'save_export_pdf'])->name('home.save_export_pdf');
    Route::post('fichier/store_export_pdf', [FichierController::class, 'store_export_pdf']);
    Route::get('fichiers/{fichier_id}/download_export_pdf', [FichierController::class, 'download_export_pdf'])->name('fichiers.download_export_pdf');
    Route::put('home/notifier/{fichier_id}/{user_id}', [FichierController::class, 'notify_export_pdf'])->name('fichiers.notify_export_pdf');

    // Référentiel - Bibliothèque projets
    Route::resource('bibliotheque_projets', BibliothequeProjetController::class)->except('edit', 'update');
    Route::get('bibliotheque_projets/creer_projet/{id}', [BibliothequeProjetController::class, 'creer_projet'])->name('bibliotheques_projets.creer_projet');
});

// Administration
Route::middleware(['auth', 'verified', 'admin:true'])->group(function () {
    Route::resource('administration', AdministrationController::class)->only('index');

    Route::prefix('administration')->group(function () {
        Route::get('/reset_db', function() {
            \Artisan::call('migrate:fresh',['--seed' => ' ']);
            return redirect()->route('administration.index');
        })->name('administration.reset_db');
        Route::resource('consolidations', ConsolidationController::class)->except('show');
        Route::resource('structures', \App\Http\Controllers\Administration\StructureController::class)->except('show', 'destroy');
        Route::put('structures/{id}/active', [\App\Http\Controllers\Administration\StructureController::class, 'active'])->name('structures.active');
    });
});
