<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('incarichi_contratti', function (Blueprint $table) {
            $table->id();
            
            // Collegamento allo stabile
            $table->unsignedBigInteger('stabile_id');
            
            // Informazioni generali
            $table->string('denominazione', 255)->comment('Nome del contratto/incarico');
            $table->enum('tipologia', ['incarico', 'contratto', 'fornitura', 'servizio'])
                  ->default('contratto');
            $table->text('descrizione')->nullable()->comment('Descrizione dettagliata');
            
            // Fornitore/Prestatore
            $table->unsignedBigInteger('fornitore_id')->nullable();
            $table->string('ragione_sociale', 255)->nullable();
            $table->string('codice_fiscale', 16)->nullable();
            $table->string('partita_iva', 11)->nullable();
            $table->text('indirizzo_fornitore')->nullable();
            $table->string('telefono_fornitore', 20)->nullable();
            $table->string('email_fornitore', 255)->nullable();
            
            // Date contratto
            $table->date('data_sottoscrizione');
            $table->date('data_inizio_validita');
            $table->date('data_fine_contratto')->nullable();
            $table->date('data_scadenza_disdetta')->nullable()
                  ->comment('Data limite per comunicare la disdetta');
            
            // Periodicità e rinnovo
            $table->enum('periodicita', ['mensile', 'bimestrale', 'trimestrale', 'semestrale', 'annuale', 'pluriennale', 'una_tantum'])
                  ->default('annuale');
            $table->boolean('rinnovo_automatico')->default(false);
            $table->integer('durata_mesi')->nullable()->comment('Durata in mesi del contratto');
            $table->integer('preavviso_disdetta_giorni')->default(30)
                  ->comment('Giorni di preavviso necessari per la disdetta');
            
            // Modalità disdetta
            $table->set('modalita_disdetta', ['raccomandata', 'raccomandata_rr', 'pec', 'email', 'fax', 'mano'])
                  ->default('raccomandata_rr');
            $table->text('note_disdetta')->nullable()
                  ->comment('Note specifiche per la disdetta');
            
            // Aspetti economici
            $table->decimal('importo_annuale', 10, 2)->nullable();
            $table->decimal('importo_mensile', 10, 2)->nullable();
            $table->enum('fatturazione', ['mensile', 'bimestrale', 'trimestrale', 'semestrale', 'annuale'])
                  ->default('annuale');
            $table->boolean('iva_inclusa')->default(false);
            $table->decimal('percentuale_iva', 5, 2)->default(22.00);
            
            // Gestione scadenze e monitoraggio
            $table->boolean('attivo')->default(true);
            $table->date('prossima_scadenza')->nullable()
                  ->comment('Prossima data di scadenza da monitorare');
            $table->boolean('disdetta_richiesta')->default(false);
            $table->date('data_richiesta_disdetta')->nullable();
            $table->text('note_disdetta_richiesta')->nullable();
            
            // Documenti collegati
            $table->text('documenti_allegati')->nullable()
                  ->comment('JSON con i documenti collegati');
            
            // Categorizzazione
            $table->enum('categoria', [
                'manutenzione', 'pulizie', 'sicurezza', 'assicurazione', 
                'energia', 'gas', 'acqua', 'telefonia', 'ascensori', 
                'giardini', 'amministrazione', 'consulenza', 'altro'
            ])->default('altro');
            
            // Priorità per gestione finanziaria
            $table->enum('priorita_finanziaria', ['bassa', 'media', 'alta', 'critica'])
                  ->default('media');
            
            // Note e osservazioni
            $table->text('note')->nullable();
            $table->text('clausole_particolari')->nullable();
            
            // Metadati
            $table->timestamps();
            $table->softDeletes();
            
            // Indici
            $table->index(['stabile_id', 'attivo']);
            $table->index(['tipologia', 'categoria']);
            $table->index(['data_scadenza_disdetta']);
            $table->index(['prossima_scadenza']);
            $table->index(['data_fine_contratto']);
            
            // Chiavi esterne
            $table->foreign('stabile_id')
                  ->references('id')
                  ->on('stabili')
                  ->onDelete('cascade');
                  
            $table->foreign('fornitore_id')
                  ->references('id')
                  ->on('fornitori')
                  ->onDelete('set null');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('incarichi_contratti');
    }
};
