<?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('unita_immobiliari', function (Blueprint $table) {
            $table->id();
            $table->foreignId('stabile_id')->constrained('stabili')->onDelete('cascade');
            $table->foreignId('palazzina_id')->nullable()->constrained('palazzine')->onDelete('cascade');

            // Identificatori e codifica
            $table->string('codice_unita', 20)->unique(); // A-1-3-05
            $table->string('denominazione')->nullable();
            $table->text('descrizione')->nullable();

            // Posizione fisica gerarchica
            $table->string('palazzina', 10); // A, B, C o 1, 2, 3
            $table->string('scala', 10); // 1, 2, 3 o A, B, C
            $table->tinyInteger('piano'); // -2, -1, 0, 1, 2, 3... (0=piano terra)
            $table->string('interno', 10); // numero appartamento/locale
            $table->string('posizione_dettagliata')->nullable(); // fronte strada, cortile, angolo

            // Dati catastali specifici dell'unità
            $table->string('sezione_urbana', 10)->nullable();
            $table->string('foglio', 20)->nullable();
            $table->string('particella', 20)->nullable();
            $table->string('subalterno', 20)->unique(); // UNIVOCO per ogni unità
            $table->string('categoria_catastale', 10)->nullable(); // A/1, A/2, C/1, etc.
            $table->string('classe', 10)->nullable();
            $table->decimal('consistenza', 8, 2)->nullable(); // vani, mq, mc
            $table->decimal('rendita_catastale', 10, 2)->nullable();

            // Superfici
            $table->decimal('superficie_commerciale', 8, 2)->nullable();
            $table->decimal('superficie_calpestabile', 8, 2)->nullable();
            $table->decimal('superficie_balconi', 6, 2)->nullable();
            $table->decimal('superficie_giardino_privato', 8, 2)->nullable();

            // Tipologia e utilizzo
            $table->enum('tipo_unita', [
                'abitazione',
                'studio_professionale',
                'attivita_commerciale',
                'magazzino_deposito',
                'box_garage',
                'cantina',
                'soffitta',
                'spazio_comune_redditizio',
                'locale_tecnico',
                'altro'
            ])->default('abitazione');

            $table->enum('utilizzo_attuale', [
                'abitazione_principale',
                'abitazione_secondaria',
                'studio_medico',
                'studio_legale',
                'struttura_ricettiva',
                'attivita_commerciale',
                'locale_commerciale_affitto',
                'sala_eventi_affittabile',
                'parcheggio_pagamento',
                'lavanderia_comune',
                'deposito_attrezzature',
                'ufficio',
                'magazzino',
                'non_utilizzato'
            ])->default('abitazione_principale');

            // Caratteristiche strutturali
            $table->tinyInteger('numero_locali')->nullable();
            $table->tinyInteger('numero_bagni')->nullable();
            $table->tinyInteger('numero_camere')->nullable();
            $table->enum('tipo_cucina', ['abitabile', 'cucinotto', 'angolo_cottura', 'assente'])->nullable();
            $table->boolean('ha_balconi')->default(false);
            $table->tinyInteger('numero_balconi')->default(0);
            $table->boolean('ha_giardino_privato')->default(false);
            $table->boolean('ha_posto_auto_assegnato')->default(false);
            $table->boolean('ha_cantina_assegnata')->default(false);
            $table->boolean('ha_soffitta_assegnata')->default(false);

            // Impianti specifici unità
            $table->enum('riscaldamento', ['centralizzato', 'autonomo', 'assente'])->default('centralizzato');
            $table->boolean('ha_climatizzazione')->default(false);
            $table->integer('anno_impianto_elettrico')->nullable();
            $table->integer('anno_impianto_idraulico')->nullable();
            $table->boolean('ha_impianto_gas')->default(false);
            $table->integer('anno_sostituzione_infissi')->nullable();

            // Millesimi di proprietà
            $table->decimal('millesimi_generali', 6, 3); // obbligatorio
            $table->decimal('millesimi_riscaldamento', 6, 3)->nullable();
            $table->decimal('millesimi_acqua', 6, 3)->nullable();
            $table->decimal('millesimi_ascensore', 6, 3)->nullable();
            $table->decimal('millesimi_scale', 6, 3)->nullable();

            // Autorizzazioni e licenze
            $table->string('cin', 20)->nullable(); // Codice Identificativo Nazionale
            $table->string('licenza_commerciale', 50)->nullable();
            $table->string('autorizzazione_professionale', 100)->nullable();
            $table->boolean('ha_cambio_destinazione_uso')->default(false);
            $table->date('data_scadenza_autorizzazioni')->nullable();
            $table->text('note_autorizzazioni')->nullable();

            // Stato e condizioni
            $table->enum('stato_conservazione', ['ottimo', 'buono', 'discreto', 'da_ristrutturare'])->default('buono');
            $table->integer('anno_ultima_ristrutturazione')->nullable();
            $table->enum('stato_occupazione', ['occupata_proprietario', 'occupata_inquilino', 'libera', 'in_vendita', 'in_affitto'])->default('occupata_proprietario');

            // Valutazioni economiche
            $table->decimal('valore_commerciale_stimato', 12, 2)->nullable();
            $table->decimal('canone_locazione_mensile', 8, 2)->nullable();
            $table->date('data_ultima_valutazione')->nullable();

            // Gestione e controllo
            $table->boolean('attiva')->default(true);
            $table->boolean('unita_demo')->default(false); // per dati demo/test
            $table->text('note')->nullable();

            // Audit trail
            $table->timestamps();
            $table->foreignId('created_by')->nullable()->constrained('users');
            $table->foreignId('updated_by')->nullable()->constrained('users');

            // Indici per performance e ricerche
            $table->index(['stabile_id', 'palazzina', 'scala', 'piano', 'interno']);
            $table->index(['stabile_id', 'tipo_unita']);
            $table->index(['stabile_id', 'utilizzo_attuale']);
            $table->index(['stabile_id', 'stato_occupazione']);
            $table->index('palazzina_id');
            $table->index('subalterno');

            // Vincoli di unicità
            $table->unique(['stabile_id', 'palazzina', 'scala', 'piano', 'interno']);
        });
    }

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