<?php

use App\Models\Environments\Environment;
use App\Models\Support\EnvironmentSupport;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

/**
 * Recalcula `environments.environment_support_id` para los que ya tienen contratos.
 *
 * El puntero al contrato de soporte vigente estaba **a NULL en todos los entornos** de
 * la base real, incluidos los que sí tenían filas en `environment_support`. Se rellenaba
 * a mano en el seeder y en ningún otro sitio, así que cualquier cosa que dependiera de
 * él —los accesores `supportend`, `supportstatus`…— devolvía vacío en silencio.
 *
 * A partir de ahora lo mantiene el modelo en cada guardado y borrado
 * (`EnvironmentSupport::sincronizarEntorno()`), pero eso no arregla las filas que ya
 * existen: nadie las va a volver a guardar.
 *
 * **No se toca `has_support`.** Hay entornos marcados con soporte y sin ningún contrato,
 * y eso es una decisión comercial mal registrada, no un dato derivable: apagarles la
 * bandera desde una migración sería decidir por Comercial que no tienen soporte. La
 * pantalla del entorno ya dice la verdad —«no tiene ningún soporte contratado»—, y en
 * cuanto alguien asigne uno, la bandera se pone bien sola.
 */
return new class extends Migration
{
    public function up(): void
    {
        $entornos = DB::table('environment_support')
            ->distinct()
            ->pluck('environment_id');

        foreach ($entornos as $id) {
            $entorno = Environment::find($id);

            if (!$entorno) {
                continue;
            }

            // El vigente es el de fin más lejano, igual que en el modelo.
            $vigente = EnvironmentSupport::where('environment_id', $id)
                ->orderByDesc('end_at')
                ->first();

            if ($vigente === null) {
                continue;
            }

            // Escritura directa: `update()` en el modelo dispararía el observador de
            // `EnvironmentSupport`, y aquí no hace falta dar la vuelta entera.
            DB::table('environments')
                ->where('id', $id)
                ->update(['environment_support_id' => $vigente->id]);
        }
    }

    public function down(): void
    {
        // Volver a dejarlo a NULL sería recuperar el estado roto a propósito. El puntero
        // es derivable, así que no hay nada que perder al mantenerlo.
    }
};
