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

declare(strict_types=1);

/** Banco de preguntas y evaluación de demostración. bin/sembrar-evaluacion */

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\Evaluaciones\Models\Banco;
use App\Modules\Evaluaciones\Models\Evaluacion;
use App\Modules\Evaluaciones\Models\Item;
use App\Modules\Evaluaciones\Models\ItemOpcion;

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

$curso = Curso::query()->where('slug', 'excel-basico')->firstOrFail();

$banco = Banco::query()->updateOrCreate(
    ['curso_id' => $curso->id, 'nombre' => 'Excel Básico — banco general'],
    ['descripcion' => 'Preguntas de las dos unidades. La evaluación toma 5 al azar.'],
);

// Se rehace el banco en cada siembra para que no se acumulen duplicados.
Item::query()->where('banco_id', $banco->id)->delete();

$preguntas = [
    ['opcion_unica', '¿Qué símbolo inicia una fórmula en Excel?',
     [['=', true], ['+', false], ['#', false], ['*', false]],
     'Toda fórmula empieza con el signo igual.'],

    ['opcion_unica', '¿Cómo se llama la intersección de una fila y una columna?',
     [['Celda', true], ['Rango', false], ['Hoja', false], ['Libro', false]],
     'La celda es la unidad mínima de la planilla.'],

    ['verdadero_falso', 'Una referencia absoluta se escribe con el signo $.',
     [['Verdadero', true], ['Falso', false]],
     'El $ fija la fila, la columna o ambas.'],

    ['opcion_multiple', '¿Cuáles de estas son funciones de agregación?',
     [['SUMA', true], ['PROMEDIO', true], ['CONCATENAR', false], ['MAX', true]],
     'CONCATENAR une textos; no agrega valores.'],

    ['respuesta_corta', '¿Qué función suma un conjunto de celdas?',
     [], 'La función SUMA acepta celdas sueltas o un rango.', "suma\nsumar\nfunción suma\n=suma"],

    ['opcion_unica', '¿Qué devuelve la función CONTAR?',
     [['La cantidad de celdas con números', true], ['La suma de las celdas', false],
      ['El promedio', false], ['La celda más grande', false]],
     'CONTAR cuenta celdas numéricas; CONTARA cuenta las no vacías.'],

    ['opcion_unica', '¿Qué combinación fija una referencia al editarla?',
     [['F4', true], ['F2', false], ['Ctrl+F', false], ['Alt+F', false]],
     'F4 alterna entre los tipos de referencia.'],

    ['verdadero_falso', 'Un libro de Excel puede tener varias hojas.',
     [['Verdadero', true], ['Falso', false]],
     'Un libro es el archivo; las hojas son sus pestañas.'],
];

foreach ($preguntas as $pregunta) {
    // Solo la de respuesta corta trae el quinto elemento.
    [$tipo, $enunciado, $opciones, $retro] = $pregunta;
    $aceptadas = $pregunta[4] ?? null;

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

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

$unidad = Unidad::query()->where('curso_id', $curso->id)->where('numero', 2)->firstOrFail();

$actividad = Actividad::query()->updateOrCreate(
    ['curso_id' => $curso->id, 'unidad_id' => $unidad->id, 'orden' => 5],
    [
        'tipo'              => 'evaluacion',
        'titulo'            => 'Evaluación final',
        'descripcion'       => 'Cinco preguntas tomadas al azar del banco.',
        'obligatoria'       => true,
        'regla_completitud' => 'nota_minima',
        'umbral'            => 60,
    ],
);

Evaluacion::query()->updateOrCreate(
    ['actividad_id' => $actividad->id],
    [
        'banco_id'                  => $banco->id,
        'cantidad_items'            => 5,
        'intentos_max'              => 3,
        'nota_minima'               => 60,
        'minutos_limite'            => 15,
        'mezclar_items'             => true,
        'mezclar_opciones'          => true,
        'mostrar_retroalimentacion' => true,
    ],
);

printf("Banco: %s (%d preguntas)\n", $banco->nombre, count($preguntas));
printf("Evaluación: actividad %d — 5 de %d ítems, 3 intentos, 60%% mínimo, 15 min\n",
    $actividad->id, count($preguntas));
