<?php

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

return new class extends Migration
{
    /**
     * Templates pasan a ser GLOBALES. Se introduce una tabla pivot many-to-many
     * para "asignar" plantillas globales a proyectos. Drop de la columna phase_id
     * (asociación a fase descartada). Se mantiene project_id en la tabla por
     * compatibilidad — pero ya no es la fuente de pertenencia.
     */
    public function up(): void
    {
        // Pivot template ↔ project (idempotente: si el up() falló a mitad la primera
        // vez, la tabla puede existir ya; en ese caso saltamos su creación).
        if (! Schema::hasTable('inspection_template_project')) {
            Schema::create('inspection_template_project', function (Blueprint $table) {
                $table->id();
                $table->foreignId('inspection_template_id')->constrained()->cascadeOnDelete();
                $table->foreignId('project_id')->constrained()->cascadeOnDelete();
                $table->timestamps();
                $table->unique(['inspection_template_id', 'project_id'], 'itp_template_project_unique');
            });
        }

        // Migrar la asignación existente (project_id en inspection_templates → pivot)
        $rows = DB::table('inspection_templates')->whereNotNull('project_id')->get(['id', 'project_id']);
        foreach ($rows as $r) {
            // Evitar duplicados; si el proyecto ya no existe lo ignoramos
            $projectExists = DB::table('projects')->where('id', $r->project_id)->exists();
            if (! $projectExists) {
                continue;
            }

            DB::table('inspection_template_project')->updateOrInsert(
                ['inspection_template_id' => $r->id, 'project_id' => $r->project_id],
                ['created_at' => now(), 'updated_at' => now()],
            );
        }

        // Drop columna phase_id (la asociación a fase deja de existir).
        // ORDEN IMPORTANTE en MySQL: primero FK, luego índice, luego columna.
        if (Schema::hasColumn('inspection_templates', 'phase_id')) {
            Schema::table('inspection_templates', function (Blueprint $table) {
                // 1) FK primero: si no la dropeamos, MySQL rechaza soltar el índice
                //    que la sustenta ("needed in a foreign key constraint").
                try {
                    $table->dropForeign(['phase_id']);
                } catch (Throwable $e) { /* sqlite sin FKs / ya inexistente */
                }
                // 2) Índice después (nombre por convención de Laravel).
                try {
                    $table->dropIndex('inspection_templates_phase_id_index');
                } catch (Throwable $e) { /* ya no existe */
                }
                // 3) Columna al final.
                $table->dropColumn('phase_id');
            });
        }

        // project_id se mantiene en inspection_templates (puede usarse como
        // "proyecto creador/origen" pero ya no determina visibilidad).
    }

    public function down(): void
    {
        if (! Schema::hasColumn('inspection_templates', 'phase_id')) {
            Schema::table('inspection_templates', function (Blueprint $table) {
                $table->foreignId('phase_id')->nullable()->constrained('phases')->onDelete('set null');
                $table->index('phase_id');
            });
        }

        Schema::dropIfExists('inspection_template_project');
    }
};
