<?php

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

return new class extends Migration
{
    /**
     * NETGESCON MIGRATION: Aggiungi Colonne Avanzate Documenti
     * 
     * Aggiunge le colonne per il sistema avanzato di gestione documentale
     * mantenendo compatibilità con il sistema esistente.
     * 
     * @author GitHub Copilot
     * @date 22/07/2025
     * @version 1.0.0
     */
    public function up()
    {
        Schema::table('documenti', function (Blueprint $table) {
            // Verifica se le colonne non esistono già
            if (!Schema::hasColumn('documenti', 'stabile_id')) {
                $table->foreignId('stabile_id')->nullable()->constrained('stabili')->onDelete('cascade');
            }

            if (!Schema::hasColumn('documenti', 'unita_id')) {
                $table->foreignId('unita_id')->nullable()->constrained('unita_immobiliari')->onDelete('set null');
            }

            if (!Schema::hasColumn('documenti', 'utente_id')) {
                $table->foreignId('utente_id')->nullable()->constrained('users')->onDelete('set null');
            }

            // Informazioni documento avanzate
            if (!Schema::hasColumn('documenti', 'nome')) {
                $table->string('nome', 255)->nullable();
            }

            if (!Schema::hasColumn('documenti', 'tipologia')) {
                $table->enum('tipologia', [
                    'fattura',
                    'ricevuta',
                    'contratto',
                    'preventivo',
                    'verbale',
                    'comunicazione',
                    'relazione_tecnica',
                    'certificato',
                    'planimetria',
                    'foto',
                    'altro'
                ])->nullable();
            }

            if (!Schema::hasColumn('documenti', 'fornitore')) {
                $table->string('fornitore', 200)->nullable();
            }

            if (!Schema::hasColumn('documenti', 'data_documento')) {
                $table->date('data_documento')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'data_scadenza')) {
                $table->date('data_scadenza')->nullable();
            }

            // Informazioni economiche
            if (!Schema::hasColumn('documenti', 'importo_collegato')) {
                $table->decimal('importo_collegato', 10, 2)->nullable();
            }

            if (!Schema::hasColumn('documenti', 'categoria_spesa')) {
                $table->enum('categoria_spesa', [
                    'spese_ordinarie',
                    'riscaldamento',
                    'acqua',
                    'ascensore',
                    'pulizie',
                    'manutenzione',
                    'spese_straordinarie',
                    'amministrazione',
                    'altro'
                ])->nullable();
            }

            // Sistema di classificazione
            if (!Schema::hasColumn('documenti', 'tags')) {
                $table->text('tags')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'note')) {
                $table->text('note')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'numero_protocollo')) {
                $table->string('numero_protocollo', 50)->unique()->nullable();
            }

            // Metadati file aggiuntivi
            if (!Schema::hasColumn('documenti', 'percorso_file')) {
                $table->string('percorso_file', 500)->nullable();
            }

            if (!Schema::hasColumn('documenti', 'numero_pagine')) {
                $table->integer('numero_pagine')->default(1);
            }

            if (!Schema::hasColumn('documenti', 'estensione')) {
                $table->string('estensione', 10)->nullable();
            }

            // OCR e ricerca
            if (!Schema::hasColumn('documenti', 'contenuto_ocr')) {
                $table->longText('contenuto_ocr')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'metadati_ocr')) {
                $table->json('metadati_ocr')->nullable();
            }

            // Workflow e stati
            if (!Schema::hasColumn('documenti', 'approvato')) {
                $table->boolean('approvato')->default(false);
            }

            if (!Schema::hasColumn('documenti', 'archiviato')) {
                $table->boolean('archiviato')->default(false);
            }

            if (!Schema::hasColumn('documenti', 'urgente')) {
                $table->boolean('urgente')->default(false);
            }

            if (!Schema::hasColumn('documenti', 'is_demo')) {
                $table->boolean('is_demo')->default(false);
            }

            // Integrazione contabilità
            if (!Schema::hasColumn('documenti', 'movimento_contabile_id')) {
                $table->foreignId('movimento_contabile_id')->nullable()->constrained('movimenti_contabili')->onDelete('set null');
            }

            if (!Schema::hasColumn('documenti', 'collegato_budget')) {
                $table->boolean('collegato_budget')->default(false);
            }

            // Audit trail
            if (!Schema::hasColumn('documenti', 'data_upload')) {
                $table->timestamp('data_upload')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'data_approvazione')) {
                $table->timestamp('data_approvazione')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'data_archiviazione')) {
                $table->timestamp('data_archiviazione')->nullable();
            }

            if (!Schema::hasColumn('documenti', 'approvato_da')) {
                $table->foreignId('approvato_da')->nullable()->constrained('users')->onDelete('set null');
            }
        });

        // Aggiungi indici per performance (solo se non esistono)
        Schema::table('documenti', function (Blueprint $table) {
            $indexNames = collect(\DB::select("SHOW INDEX FROM documenti"))->pluck('Key_name');

            if (!$indexNames->contains('documenti_stabile_tipologia_index')) {
                $table->index(['stabile_id', 'tipologia'], 'documenti_stabile_tipologia_index');
            }

            if (!$indexNames->contains('documenti_data_documento_index')) {
                $table->index(['data_documento']);
            }

            if (!$indexNames->contains('documenti_categoria_spesa_index')) {
                $table->index(['categoria_spesa']);
            }

            if (!$indexNames->contains('documenti_urgente_approvato_index')) {
                $table->index(['urgente', 'approvato']);
            }

            if (!$indexNames->contains('documenti_is_demo_index')) {
                $table->index(['is_demo']);
            }
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down()
    {
        Schema::table('documenti', function (Blueprint $table) {
            // Rimuovi le colonne aggiunte (in ordine inverso per le foreign keys)
            $columns = [
                'approvato_da',
                'data_archiviazione',
                'data_approvazione',
                'data_upload',
                'collegato_budget',
                'movimento_contabile_id',
                'is_demo',
                'urgente',
                'archiviato',
                'approvato',
                'metadati_ocr',
                'contenuto_ocr',
                'estensione',
                'numero_pagine',
                'percorso_file',
                'numero_protocollo',
                'note',
                'tags',
                'categoria_spesa',
                'importo_collegato',
                'data_scadenza',
                'data_documento',
                'fornitore',
                'tipologia',
                'nome',
                'utente_id',
                'unita_id',
                'stabile_id'
            ];

            foreach ($columns as $column) {
                if (Schema::hasColumn('documenti', $column)) {
                    $table->dropColumn($column);
                }
            }
        });
    }
};
