<?php

use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\SuperAdmin\UserController as SuperAdminUserController;
use App\Http\Controllers\SuperAdmin\CategoriaTicketController;
use App\Http\Controllers\SuperAdmin\AmministratoreController as SuperAdminAmministratoreController;
use App\Http\Controllers\Admin\StabileController;
use App\Http\Controllers\Admin\SoggettoController;
use App\Http\Controllers\Admin\UnitaImmobiliareController;
use App\Http\Controllers\Admin\FornitoreController;
use App\Http\Controllers\Admin\TicketController;
use App\Http\Controllers\Admin\ContabilitaController;
use App\Http\Controllers\Admin\DocumentoController;
use App\Http\Controllers\Admin\PreventivoController;
use App\Http\Controllers\Admin\BilancioController;
use App\Http\Controllers\Admin\VoceSpesaController;
use App\Http\Controllers\Admin\RipartizioneSpesaController;
use App\Http\Controllers\Admin\PianoRateizzazioneController;
use App\Http\Controllers\Admin\RataController;
use App\Http\Controllers\Condomino\DashboardController as CondominoDashboardController;
use App\Http\Controllers\Condomino\TicketController as CondominoTicketController;
use App\Http\Controllers\Condomino\DocumentoController as CondominoDocumentoController;
use App\Http\Controllers\Condomino\UnitaController as CondominoUnitaController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\Admin\ImpostazioniController;
use App\Http\Controllers\Admin\ApiTokenController;
use App\Http\Controllers\Admin\RubricaController;
use App\Http\Controllers\Admin\RubricaUniversaleController;
use App\Http\Controllers\Admin\DatiBancariController;
use App\Http\Controllers\Admin\DocumentoCollegatoController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;

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

// --- Authenticated Routes ---
Route::middleware(['auth', 'verified'])->group(function () {

    // Generic Dashboard (redirects to the correct panel based on role)
    Route::get('/dashboard', function () {
        if (Auth::check()) {
            if (Auth::user()->hasRole('super-admin')) {
                return redirect()->route('superadmin.dashboard');
            } elseif (Auth::user()->hasRole(['admin', 'amministratore'])) {
                return redirect()->route('admin.dashboard');
            } elseif (Auth::user()->hasRole('condomino')) {
                return redirect()->route('condomino.dashboard');
            }
        }
        return view('dashboard');
    })->name('dashboard');

    // Profile Routes
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');

    // --- SUPER-ADMIN PANEL ---
    Route::middleware(['role:super-admin'])->prefix('superadmin')->name('superadmin.')->group(function () {
        Route::get('/', function () {
            return view('superadmin.dashboard');
        })->name('dashboard');

        // Gestione utenti
        Route::resource('users', SuperAdminUserController::class)->except(['show']);
        Route::patch('users/{user}/update-role', [SuperAdminUserController::class, 'updateRole'])->name('users.updateRole');
        Route::get('users/{user}/impersonate', [SuperAdminUserController::class, 'impersonate'])->name('users.impersonate');


        // Impostazioni Sistema
        Route::get('impostazioni', [\App\Http\Controllers\SuperAdmin\ImpostazioniController::class, 'index'])->name('impostazioni.index');
        Route::post('impostazioni', [\App\Http\Controllers\SuperAdmin\ImpostazioniController::class, 'store'])->name('impostazioni.store');
        Route::post('impostazioni/theme', [\App\Http\Controllers\SuperAdmin\ImpostazioniController::class, 'theme'])->name('impostazioni.theme');
        // Gestione Amministratori
        Route::resource('amministratori', SuperAdminAmministratoreController::class)
            ->except(['show'])
            ->parameters(['amministratori' => 'amministratore']);

        // Gestione Categorie Ticket
        Route::resource('categorie-ticket', CategoriaTicketController::class)->except(['show']);

        // Gestione Stabili (ora anche per super-admin)
        Route::resource('stabili', StabileController::class);
        Route::resource('stabili.unitaImmobiliari', UnitaImmobiliareController::class)->shallow();
        Route::resource('unitaImmobiliari', UnitaImmobiliareController::class)->only(['edit', 'update', 'destroy']);

        // Gestione Palazzine per Super Admin
        Route::resource('palazzine', \App\Http\Controllers\Admin\PalazzineController::class);
        Route::get('palazzine/{palazzina}/genera-unita', [\App\Http\Controllers\Admin\PalazzineController::class, 'generaUnita'])->name('palazzine.genera-unita');
        Route::get('palazzine/{palazzina}/anteprima-generazione', [\App\Http\Controllers\Admin\PalazzineController::class, 'anteprimaGenerazione'])->name('palazzine.anteprima-generazione');

        Route::resource('soggetti', SoggettoController::class);
        Route::resource('fornitori', FornitoreController::class);
        Route::resource('tickets', TicketController::class);
        Route::resource('documenti', DocumentoController::class)->except(['edit', 'update']);

        // Diagnostica
        Route::get('/diagnostica', function () {
            return view('superadmin.diagnostica');
        })->name('diagnostica');
        Route::get('/diagnostica-menu', function () {
            return view('superadmin.diagnostica_menu');
        })->name('diagnostica_menu');
    });

    // --- ADMIN / AMMINISTRATORE PANEL ---
    Route::middleware(['role:admin|amministratore'])->prefix('admin')->name('admin.')->group(function () {
        // Dashboard dell'amministratore
        Route::get('/', [DashboardController::class, 'index'])->name('dashboard');

        // Rotte CRUD principali
        Route::resource('stabili', StabileController::class);
        Route::resource('stabili.unitaImmobiliari', UnitaImmobiliareController::class)->shallow();
        Route::resource('unitaImmobiliari', UnitaImmobiliareController::class)->only(['edit', 'update', 'destroy']);

        // Gestione Palazzine
        Route::resource('palazzine', \App\Http\Controllers\Admin\PalazzineController::class);

        // Sistema Debug
        Route::prefix('debug')->name('debug.')->group(function () {
            Route::get('/', [App\Http\Controllers\Admin\SystemDebugController::class, 'index'])->name('index');
            Route::post('/scan-duplicates', [App\Http\Controllers\Admin\SystemDebugController::class, 'scanDuplicates'])->name('scan-duplicates');
            Route::post('/clean-duplicates', [App\Http\Controllers\Admin\SystemDebugController::class, 'cleanDuplicates'])->name('clean-duplicates');
            Route::post('/verify-routes', [App\Http\Controllers\Admin\SystemDebugController::class, 'verifyRoutes'])->name('verify-routes');
            Route::post('/check-models', [App\Http\Controllers\Admin\SystemDebugController::class, 'checkModels'])->name('check-models');
            Route::post('/full-scan', [App\Http\Controllers\Admin\SystemDebugController::class, 'fullScan'])->name('full-scan');
            Route::post('/generate-report', [App\Http\Controllers\Admin\SystemDebugController::class, 'generateReport'])->name('generate-report');
        });
        Route::get('palazzine/{palazzina}/genera-unita', [\App\Http\Controllers\Admin\PalazzineController::class, 'generaUnita'])->name('palazzine.genera-unita');
        Route::get('palazzine/{palazzina}/anteprima-generazione', [\App\Http\Controllers\Admin\PalazzineController::class, 'anteprimaGenerazione'])->name('palazzine.anteprima-generazione');

        // Gestione Unità Immobiliari Avanzata
        Route::resource('unita-immobiliari', \App\Http\Controllers\Admin\UnitaImmobiliariController::class);

        Route::resource('soggetti', SoggettoController::class);
        Route::resource('fornitori', FornitoreController::class);
        Route::resource('tickets', TicketController::class);

        // Gestione Documenti
        Route::resource('documenti', DocumentoController::class)->except(['edit', 'update']);
        Route::get('documenti/{documento}/download', [DocumentoController::class, 'download'])->name('documenti.download');

        // Gestione Preventivi
        Route::prefix('preventivi')->name('preventivi.')->group(function () {
            Route::get('/', [PreventivoController::class, 'index'])->name('index');
            Route::get('/create', [PreventivoController::class, 'create'])->name('create');
            Route::post('/', [PreventivoController::class, 'store'])->name('store');
            Route::get('/{preventivo}', [PreventivoController::class, 'show'])->name('show');
            Route::get('/{preventivo}/edit', [PreventivoController::class, 'edit'])->name('edit');
            Route::put('/{preventivo}', [PreventivoController::class, 'update'])->name('update');
            Route::post('/{preventivo}/approva', [PreventivoController::class, 'approva'])->name('approva');
            Route::post('/{preventivo}/genera-rate', [PreventivoController::class, 'generaRate'])->name('genera-rate');
            Route::get('/{preventivo}/storico', [PreventivoController::class, 'storicoModifiche'])->name('storico');
            Route::get('/pianificazione/dashboard', [PreventivoController::class, 'pianificazione'])->name('pianificazione');
        });

        // Gestione Bilanci e Consuntivi
        Route::prefix('bilanci')->name('bilanci.')->group(function () {
            Route::get('/', [BilancioController::class, 'index'])->name('index');
            Route::get('/create', [BilancioController::class, 'create'])->name('create');
            Route::post('/', [BilancioController::class, 'store'])->name('store');
            Route::get('/{bilancio}', [BilancioController::class, 'show'])->name('show');
            Route::get('/{bilancio}/edit', [BilancioController::class, 'edit'])->name('edit');
            Route::put('/{bilancio}', [BilancioController::class, 'update'])->name('update');
            Route::post('/{bilancio}/calcola-conguagli', [BilancioController::class, 'calcolaConguagli'])->name('calcola-conguagli');
            Route::post('/{bilancio}/genera-rate-conguaglio', [BilancioController::class, 'generaRateConguaglio'])->name('genera-rate-conguaglio');
            Route::post('/{bilancio}/quadratura', [BilancioController::class, 'quadratura'])->name('quadratura');
            Route::post('/{bilancio}/chiusura-esercizio', [BilancioController::class, 'chiusuraEsercizio'])->name('chiusura-esercizio');
            Route::get('/{bilancio}/storico', [BilancioController::class, 'storicoModifiche'])->name('storico');
            Route::get('/quadrature/dashboard', [BilancioController::class, 'quadratureDashboard'])->name('quadrature');
            Route::get('/conguagli/dashboard', [BilancioController::class, 'conguagliDashboard'])->name('conguagli');
            Route::get('/rimborsi/dashboard', [BilancioController::class, 'rimborsiDashboard'])->name('rimborsi');
            Route::get('/automazioni/dashboard', [BilancioController::class, 'automazioniDashboard'])->name('automazioni');
        });

        // Gestione Contabilità
        Route::prefix('contabilita')->name('contabilita.')->group(function () {
            Route::get('/', [ContabilitaController::class, 'index'])->name('index');
            Route::get('/movimenti', [ContabilitaController::class, 'movimenti'])->name('movimenti');
            Route::get('/registrazione', [ContabilitaController::class, 'registrazione'])->name('registrazione');
            Route::post('/registrazione', [ContabilitaController::class, 'storeRegistrazione'])->name('store-registrazione');
            Route::get('/import-xml', [ContabilitaController::class, 'importXml'])->name('import-xml');
            Route::post('/import-xml', [ContabilitaController::class, 'importXml'])->name('import-xml.store');
        });

        // Gestione Voci di Spesa
        Route::resource('voci-spesa', VoceSpesaController::class);
        Route::post('voci-spesa/{voceSpesa}/duplicate', [VoceSpesaController::class, 'duplicate'])->name('voci-spesa.duplicate');
        Route::get('ajax/tabelle-millesimali', [VoceSpesaController::class, 'getTabelleMillesimali'])->name('ajax.tabelle-millesimali');

        // Gestione Ripartizioni Spesa
        Route::resource('ripartizioni-spesa', RipartizioneSpesaController::class);
        Route::post('ripartizioni-spesa/{ripartizioneSpesa}/conferma', [RipartizioneSpesaController::class, 'conferma'])->name('ripartizioni-spesa.conferma');

        // Gestione Piani Rateizzazione
        Route::resource('piani-rateizzazione', PianoRateizzazioneController::class);
        Route::post('piani-rateizzazione/{pianoRateizzazione}/attiva', [PianoRateizzazioneController::class, 'attiva'])->name('piani-rateizzazione.attiva');
        Route::post('piani-rateizzazione/{pianoRateizzazione}/sospendi', [PianoRateizzazioneController::class, 'sospendi'])->name('piani-rateizzazione.sospendi');

        // Gestione Rate
        Route::resource('rate', RataController::class)->only(['index', 'show', 'edit', 'update']);
        Route::get('rate/{rata}/pagamento', [RataController::class, 'showPagamentoForm'])->name('rate.pagamento');
        Route::post('rate/{rata}/registra-pagamento', [RataController::class, 'registraPagamento'])->name('rate.registra-pagamento');
        Route::delete('rate/{rata}/annulla-pagamento', [RataController::class, 'annullaPagamento'])->name('rate.annulla-pagamento');
        Route::get('rate/{rata}/posticipo', [RataController::class, 'showPosticipoForm'])->name('rate.posticipo');
        Route::post('rate/{rata}/posticipa', [RataController::class, 'posticipa'])->name('rate.posticipa');
        Route::get('rate/report', [RataController::class, 'report'])->name('rate.report');
        Route::get('rate/export/csv', [RataController::class, 'exportCsv'])->name('rate.export.csv');

        // Impostazioni e API Tokens
        Route::get('impostazioni', [ImpostazioniController::class, 'index'])->name('impostazioni.index');
        Route::post('impostazioni', [ImpostazioniController::class, 'store'])->name('impostazioni.store');
        Route::post('impostazioni/theme', [ImpostazioniController::class, 'theme'])->name('impostazioni.theme');
        Route::get('api-tokens', [ApiTokenController::class, 'index'])->name('api-tokens.index');
        Route::post('api-tokens', [ApiTokenController::class, 'store'])->name('api-tokens.store');
        Route::delete('api-tokens/{token_id}', [ApiTokenController::class, 'destroy'])->name('api-tokens.destroy');

        // Rubrica
        Route::get('rubrica', [RubricaController::class, 'index'])->name('rubrica.index');

        // Rubrica Universale - Sistema contatti unificato
        Route::resource('rubrica-universale', RubricaUniversaleController::class);
        Route::get('rubrica-universale/ajax/search', [RubricaUniversaleController::class, 'ajaxSearch'])->name('rubrica-universale.ajax.search');
        Route::get('rubrica-universale/categoria/{categoria}', [RubricaUniversaleController::class, 'indexByCategoria'])->name('rubrica-universale.categoria');

        // Dati Bancari con integrazione rubrica universale
        Route::resource('dati-bancari', DatiBancariController::class);
        Route::get('stabili/{stabile}/dati-bancari', [DatiBancariController::class, 'indexByStabile'])->name('stabili.dati-bancari.index');
        Route::post('stabili/{stabile}/dati-bancari', [DatiBancariController::class, 'storeForStabile'])->name('stabili.dati-bancari.store');

        // Documenti Collegati con sistema protocolli
        Route::resource('documenti-collegati', DocumentoCollegatoController::class);
        Route::get('stabili/{stabile}/documenti-collegati', [DocumentoCollegatoController::class, 'indexByStabile'])->name('stabili.documenti-collegati.index');
        Route::post('stabili/{stabile}/documenti-collegati', [DocumentoCollegatoController::class, 'storeForStabile'])->name('stabili.documenti-collegati.store');
        Route::get('documenti-collegati/{documento}/download', [DocumentoCollegatoController::class, 'download'])->name('documenti-collegati.download');
        Route::get('documenti-collegati/{documento}/etichetta', [DocumentoCollegatoController::class, 'stampaEtichetta'])->name('documenti-collegati.etichetta');
        Route::post('documenti-collegati/{documento}/rinnova', [DocumentoCollegatoController::class, 'rinnova'])->name('documenti-collegati.rinnova');

        // API Routes per interfacce dinamiche
        Route::prefix('api')->name('api.')->group(function () {
            // Tabelle millesimali - API per vista Excel
            Route::get('stabili/{stabile}/tabelle-millesimali/{tabella}/dettagli', [StabileController::class, 'getTabellaMillesimaliDettagli']);
            Route::post('stabili/{stabile}/tabelle-millesimali/{tabella}/aggiorna-millesimo', [StabileController::class, 'aggiornaMillesimo']);
            Route::post('stabili/{stabile}/tabelle-millesimali/{tabella}/verifica-bilanciamento', [StabileController::class, 'verificaBilanciamento']);

            // Rubrica universale - API
            Route::get('rubrica-universale/search', [RubricaUniversaleController::class, 'apiSearch']);
            Route::get('rubrica-universale/categoria/{categoria}/list', [RubricaUniversaleController::class, 'apiListByCategoria']);

            // Dati bancari - API
            Route::get('dati-bancari/{conto}/saldo-attuale', [DatiBancariController::class, 'getSaldoAttuale']);

            // Documenti collegati - API 
            Route::get('documenti-collegati/statistiche/{stabile?}', [DocumentoCollegatoController::class, 'getStatistiche']);
            Route::get('documenti-collegati/scadenze/{giorni?}', [DocumentoCollegatoController::class, 'getScadenzeImminenti']);
        });
    });

    // --- CONDOMINO PANEL ---
    Route::middleware(['role:condomino'])->prefix('condomino')->name('condomino.')->group(function () {
        // Dashboard
        Route::get('/', [CondominoDashboardController::class, 'index'])->name('dashboard');

        // Tickets
        Route::resource('tickets', CondominoTicketController::class)->only(['index', 'create', 'store', 'show']);

        // Documenti
        Route::get('/documenti', [CondominoDocumentoController::class, 'index'])->name('documenti.index');

        // Unità Immobiliari
        Route::get('/unita', [CondominoUnitaController::class, 'index'])->name('unita.index');
        Route::get('/unita/{unitaImmobiliare}', [CondominoUnitaController::class, 'show'])->name('unita.show');
        Route::post('/unita/{unitaImmobiliare}/richiesta-modifica', [CondominoUnitaController::class, 'richiestaModifica'])->name('unita.richiesta-modifica');

        // Pagamenti (placeholder)
        Route::view('/pagamenti', 'condomino.pagamenti.index')->name('pagamenti.index');

        // Altre viste placeholder
        Route::view('/scadenze', 'condomino.scadenze')->name('scadenze');
        Route::view('/comunicazioni', 'condomino.comunicazioni')->name('comunicazioni');
        Route::view('/avvisi', 'condomino.avvisi')->name('avvisi');
        Route::view('/guasti', 'condomino.guasti')->name('guasti');
        Route::view('/contabilita', 'condomino.contabilita')->name('contabilita');
        Route::view('/fornitori', 'condomino.fornitori')->name('fornitori');
        Route::view('/bacheca', 'condomino.bacheca')->name('bacheca');
        Route::view('/sondaggi', 'condomino.sondaggi')->name('sondaggi');
    });

    // --- DEBUG ROUTE FOR PERMISSIONS ---
    Route::get('/test-permissions', function () {
        $user = Auth::user();
        echo "<h1>Diagnostica Permessi per: " . $user->name . "</h1>";
        echo "<h2>Ruoli Assegnati:</h2>";
        echo "<ul>";
        foreach ($user->getRoleNames() as $role) {
            echo "<li>" . $role . "</li>";
        }
        echo "</ul>";
    });
});

// --- PUBLIC ROUTE TO LEAVE IMPERSONATION ---
Route::get('impersonate/leave', [\Lab404\Impersonate\Controllers\ImpersonateController::class, 'leave'])->name('impersonate.leave');

// --- AUTHENTICATION ROUTES ---
require __DIR__ . '/auth.php';

Route::middleware(['auth'])->group(function () {
    Route::view('/contabilita/registrazione-test', 'contabilita.registrazione-test')
        ->name('contabilita.registrazione-test');
});
Route::get('/contabilita/registrazione-test', \App\Livewire\Contabilita\RegistrazioneTest::class)
    ->middleware(['auth'])
    ->name('contabilita.registrazione-test');

// Rotta per aggiornare la sessione con lo stabile selezionato
Route::post('/session/stabile', function (\Illuminate\Http\Request $request) {
    $request->validate(['stabile' => 'required|string']);
    session(['stabile_corrente' => $request->input('stabile')]);
    return response()->json(['ok' => true]);
})->middleware('auth')->name('session.stabile');
