#!/usr/bin/env php
<?php

declare(strict_types=1);

/**
 * Curso de muestra con todos los tipos de recurso.
 *
 *   bin/sembrar-curso-ejemplo
 *
 * Existe para enseñar la plataforma: recorre los cinco tipos de actividad y las cinco
 * reglas de completitud, usando objetos interactivos reales del repositorio —incluidos el
 * pasapalabra, el simulador y el juego de memoria—, y termina en una evaluación con banco
 * de preguntas y un certificado.
 *
 * Es idempotente: se puede volver a ejecutar.
 */

use App\Core\Kernel;
use App\Modules\Catalogo\Models\Actividad;
use App\Modules\Catalogo\Models\Curso;
use App\Modules\Catalogo\Models\Unidad;
use App\Modules\Certificacion\Models\Certificado;
use App\Modules\Certificacion\Models\CertificadoCurso;
use App\Modules\Evaluaciones\Models\Banco;
use App\Modules\Evaluaciones\Models\Evaluacion;
use App\Modules\Evaluaciones\Models\Item;
use App\Modules\Evaluaciones\Models\ItemOpcion;
use App\Modules\Objetos\Models\Objeto;

require dirname(__DIR__) . '/vendor/autoload.php';
$base = dirname(__DIR__);
Dotenv\Dotenv::createImmutable($base)->safeLoad();
(new Kernel($base))->boot();

/** Busca un objeto por su archivo; devuelve null si no está en el repositorio. */
$objeto = static fn (string $archivo): ?int
    => Objeto::query()->where('archivo', $archivo)->value('id');

// ── Curso ────────────────────────────────────────────────────────────────
$curso = Curso::query()->updateOrCreate(
    ['slug' => 'transformacion-digital-pymes'],
    [
        'titulo'  => 'Transformación Digital para Pymes',
        'resumen' => 'Diagnostica, prioriza y ejecuta la digitalización de una empresa pequeña, sin jerga y con herramientas que ya tienes.',
        'descripcion' => "Un recorrido práctico para dueños y equipos de pymes que saben que tienen que digitalizarse pero no por dónde empezar.\n\n"
            . "Cada unidad termina en algo aplicable: un diagnóstico de tu propia empresa, un mapa de procesos priorizado y un plan a noventa días.\n\n"
            . "No se requieren conocimientos técnicos previos.",
        'nivel'          => 'inicial',
        'duracion_horas' => 24,
        'estado'         => 'borrador',
    ],
);

// Se rehace la estructura para que la siembra sea repetible sin acumular duplicados.
Actividad::query()->where('curso_id', $curso->id)->delete();
Unidad::query()->where('curso_id', $curso->id)->delete();

$unidades = [];
foreach ([
    [1, 'Dónde estás parado',      'Diagnóstico honesto de la madurez digital de tu empresa.'],
    [2, 'Qué digitalizar primero', 'No todo a la vez: cómo elegir por impacto y esfuerzo.'],
    [3, 'Manos a la obra',         'Herramientas concretas y cómo evitar los errores caros.'],
    [4, 'El plan a noventa días',  'De la intención al calendario.'],
] as [$numero, $titulo, $descripcion]) {
    $unidades[$numero] = Unidad::query()->create([
        'curso_id'    => $curso->id,
        'numero'      => $numero,
        'titulo'      => $titulo,
        'descripcion' => $descripcion,
    ]);
}

// ── Actividades ──────────────────────────────────────────────────────────
// [unidad, tipo, título, regla, umbral, duración, archivo del objeto, obligatoria, cuerpo]
$plan = [
    // Unidad 1 — se abre con un video corto y un autodiagnóstico
    [1, 'video', 'Por qué digitalizar no es comprar software', 'ver_video', 80, 360, null, true, null],
    [1, 'objeto', 'Autodiagnóstico: ¿en qué punto estás?', 'progreso_objeto', 100, 0, 'autodiagnostico_perfil_academico.html', true, null],
    [1, 'lectura', 'Los cuatro frenos más comunes', 'manual', 45, 0, null, true,
        "El presupuesto casi nunca es el freno real.\n\n"
        . "1. Nadie es dueño del proyecto. Sin una persona con nombre y tiempo asignado, la digitalización es de todos y de nadie.\n\n"
        . "2. Se empieza por la herramienta. Elegir el sistema antes de entender el proceso es la forma más rápida de pagar por algo que no se usa.\n\n"
        . "3. El equipo no se entera. Una herramienta que llega por correo un lunes se abandona el martes.\n\n"
        . "4. No hay forma de saber si funcionó. Sin un número antes y después, la discusión se vuelve de opiniones."],

    // Unidad 2 — clasificar y priorizar
    [2, 'video', 'Impacto contra esfuerzo: la matriz que sí sirve', 'ver_video', 80, 480, null, true, null],
    [2, 'objeto', 'Clasifica tus procesos', 'progreso_objeto', 100, 0, 'actividad-clasificacion.html', true, null],
    [2, 'objeto', 'Memoria: la cadena de valor', 'progreso_objeto', 100, 0, 'memory_cadena_valor-1.html', false, null],

    // Unidad 3 — práctica, con el juego y el pasapalabra
    [3, 'objeto', 'Simulador: decide y mira qué pasa', 'progreso_objeto', 100, 0, 'transformacion_digital_game.html', true, null],
    [3, 'objeto', 'Pasapalabra: vocabulario digital', 'progreso_objeto', 100, 0, 'rosco_excel.html', false, null],
    [3, 'video', 'Tres errores que cuestan caro', 'ver_video', 80, 420, null, true, null],

    // Unidad 4 — cierre y evaluación
    [4, 'lectura', 'Cómo se ve un plan a noventa días', 'manual', 60, 0, null, true,
        "Un plan que funciona cabe en una página.\n\n"
        . "Días 1 a 30 — Medir. Elige un solo proceso y anota cuánto tarda hoy, cuántas personas lo tocan y dónde se traba. Sin ese número, lo demás es intuición.\n\n"
        . "Días 31 a 60 — Probar en pequeño. Una herramienta, un equipo, un proceso. Si no funciona a esta escala, no va a funcionar a la de toda la empresa.\n\n"
        . "Días 61 a 90 — Decidir. Con los dos números en la mano —antes y después— la decisión de extender o descartar deja de ser una discusión de opiniones."],
    [4, 'evaluacion', 'Evaluación final', 'nota_minima', 60, 0, null, true, null],
];

$actividadEvaluacion = null;

foreach ($plan as $i => [$u, $tipo, $titulo, $regla, $umbral, $duracion, $archivo, $obligatoria, $cuerpo]) {
    $objetoId = $archivo !== null ? $objeto($archivo) : null;

    if ($archivo !== null && $objetoId === null) {
        fwrite(STDERR, sprintf("  aviso: falta el objeto %s, la actividad queda sin contenido\n", $archivo));
    }

    $actividad = Actividad::query()->create([
        'curso_id'          => $curso->id,
        'unidad_id'         => $unidades[$u]->id,
        'orden'             => $i + 1,
        'tipo'              => $tipo,
        'titulo'            => $titulo,
        'obligatoria'       => $obligatoria,
        'recurso_url'       => $tipo === 'video' ? 'https://player.vimeo.com/video/76979871' : null,
        'cuerpo'            => $cuerpo,
        'objeto_id'         => $objetoId,
        'duracion_segundos' => $duracion,
        'regla_completitud' => $regla,
        'umbral'            => $umbral,
    ]);

    if ($tipo === 'evaluacion') {
        $actividadEvaluacion = $actividad;
    }
}

// ── Banco de preguntas ───────────────────────────────────────────────────
$banco = Banco::query()->updateOrCreate(
    ['curso_id' => $curso->id, 'nombre' => 'Transformación digital — banco general'],
    ['descripcion' => 'Preguntas de las cuatro unidades. La evaluación toma 6 al azar.'],
);
Item::query()->where('banco_id', $banco->id)->delete();

$preguntas = [
    ['opcion_unica', '¿Cuál es el freno más común para digitalizar una pyme?',
     [['Que nadie es dueño del proyecto', true], ['El precio del software', false],
      ['La falta de internet', false], ['El tamaño de la empresa', false]],
     'El presupuesto casi nunca es el problema real: lo es que nadie tenga el proyecto asignado.'],

    ['opcion_unica', 'Antes de elegir una herramienta, ¿qué conviene hacer?',
     [['Entender el proceso que se quiere mejorar', true], ['Pedir tres cotizaciones', false],
      ['Capacitar al equipo', false], ['Contratar a alguien de sistemas', false]],
     'Elegir el sistema antes de entender el proceso es la forma más rápida de pagar por algo que no se usa.'],

    ['opcion_multiple', '¿Qué debería incluir un plan a noventa días?',
     [['Un número medido antes de empezar', true], ['Una prueba en pequeño', true],
      ['La compra de todas las licencias', false], ['Una fecha para decidir si se extiende', true]],
     'Medir, probar en pequeño y decidir con datos. Comprar todo de entrada es lo contrario.'],

    ['verdadero_falso', 'Conviene digitalizar todos los procesos a la vez para no perder tiempo.',
     [['Verdadero', false], ['Falso', true]],
     'Al contrario: se elige por impacto y esfuerzo, y se prueba en pequeño.'],

    ['respuesta_corta', '¿En qué fase del plan a noventa días se mide el punto de partida?',
     [], 'Los primeros treinta días son para medir: sin ese número, lo demás es intuición.',
     "primera\nprimeros 30 dias\nprimeros treinta dias\ndias 1 a 30\nmedir"],

    ['opcion_unica', '¿Para qué sirve la matriz de impacto y esfuerzo?',
     [['Para elegir por dónde empezar', true], ['Para calcular el presupuesto', false],
      ['Para medir la satisfacción del equipo', false], ['Para comparar proveedores', false]],
     'Ordena los procesos candidatos y evita el «todo a la vez».'],

    ['verdadero_falso', 'Una herramienta que llega por correo, sin acompañamiento, suele adoptarse bien.',
     [['Verdadero', false], ['Falso', true]],
     'Es uno de los cuatro frenos: el equipo no se entera y la herramienta se abandona.'],

    ['opcion_unica', '¿Qué permite decidir si una prueba piloto se extiende?',
     [['Comparar el número de antes con el de después', true], ['La opinión del equipo', false],
      ['El costo de la licencia', false], ['El tiempo que llevó implementarla', false]],
     'Con los dos números en la mano, la decisión deja de ser una discusión de opiniones.'],
];

foreach ($preguntas as $pregunta) {
    [$tipo, $enunciado, $opciones, $retro] = $pregunta;

    $item = Item::query()->create([
        'banco_id'             => $banco->id,
        'tipo'                 => $tipo,
        'enunciado'            => $enunciado,
        'retroalimentacion'    => $retro,
        'puntaje'              => 1,
        'respuestas_aceptadas' => $pregunta[4] ?? null,
    ]);

    foreach ($opciones as $orden => [$texto, $correcta]) {
        ItemOpcion::query()->create([
            'item_id'     => $item->id,
            'texto'       => $texto,
            'es_correcta' => $correcta,
            'orden'       => $orden + 1,
        ]);
    }
}

if ($actividadEvaluacion !== null) {
    Evaluacion::query()->updateOrCreate(
        ['actividad_id' => $actividadEvaluacion->id],
        [
            'banco_id'                  => $banco->id,
            'cantidad_items'            => 6,
            'intentos_max'              => 3,
            'nota_minima'               => 60,
            'minutos_limite'            => 20,
            'mezclar_items'             => true,
            'mezclar_opciones'          => true,
            'mostrar_retroalimentacion' => true,
        ],
    );
}

// ── Certificado ──────────────────────────────────────────────────────────
$certificado = Certificado::query()->updateOrCreate(
    ['slug' => 'transformacion-digital-pymes-cert'],
    [
        'titulo'      => 'Certificado en Transformación Digital para Pymes',
        'descripcion' => 'Acredita la capacidad de diagnosticar, priorizar y planificar la digitalización de una empresa pequeña.',
        'horas'       => 24,
        'nivel'       => 'Inicial',
        'tipo'        => 'ruta',
        'activo'      => true,
    ],
);
CertificadoCurso::query()->updateOrCreate(
    ['certificado_id' => $certificado->id, 'curso_id' => $curso->id],
    ['canasta' => 1],
);

printf("Curso: %s\n", $curso->titulo);
printf("  %d unidades · %d actividades (%d obligatorias)\n",
    count($unidades),
    Actividad::query()->where('curso_id', $curso->id)->count(),
    Actividad::query()->where('curso_id', $curso->id)->where('obligatoria', true)->count());
printf("  Banco: %d preguntas, la evaluación toma 6\n", count($preguntas));
printf("  Certificado: %s\n", $certificado->titulo);
printf("  Estado: borrador — publícalo desde /admin/cursos/%s\n", $curso->slug);
