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

declare(strict_types=1);

/**
 * Visionados de video de ejemplo, para poder mirar la curva de retención con datos.
 *
 * Reparte a los matriculados en tres comportamientos que se ven en cualquier curso: quien
 * lo ve entero, quien lo deja a media y quien abre y se va. No es aleatorio puro: el
 * objetivo es que la curva tenga una caída reconocible donde mirarla.
 */

use App\Core\Kernel;
use App\Modules\Catalogo\Models\Actividad;
use App\Modules\Progreso\Services\MapaDeVisionado;
use Illuminate\Database\Capsule\Manager as DB;

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

$videos = Actividad::query()->where('tipo', 'video')->where('regla_completitud', 'ver_video')->get();

foreach ($videos as $video) {
    // La duración del catálogo sirve acá como referencia para inventar los tramos; en la
    // plataforma real la informa el reproductor.
    $duracion = (int) $video->duracion_segundos ?: 300;
    $tramos   = (int) ceil($duracion / MapaDeVisionado::SEGUNDOS_POR_TRAMO);

    $matriculados = DB::table('inscripciones')
        ->where('curso_id', $video->curso_id)
        ->pluck('usuario_id');

    $n = 0;

    foreach ($matriculados as $usuarioId) {
        $n++;

        // Tres de cada cinco lo terminan, uno lo deja pasada la mitad y otro se va pronto.
        $hasta = match ($n % 5) {
            0       => (int) ($tramos * 0.12),
            4       => (int) ($tramos * 0.55),
            default => $tramos,
        };

        $mapa = MapaDeVisionado::vacio()->conTramos(range(0, max(0, $hasta - 1)));

        DB::table('progreso')->updateOrInsert(
            ['usuario_id' => $usuarioId, 'actividad_id' => $video->id],
            [
                'estado'         => $hasta >= $tramos ? 'completada' : 'en_progreso',
                'porcentaje'     => (int) round($hasta / $tramos * 100),
                'evidencia_json' => json_encode([
                    'video_duracion' => $duracion,
                    'video_tramos'   => $mapa->aBase64(),
                ], JSON_UNESCAPED_UNICODE),
                'visto_en'       => date('Y-m-d H:i:s'),
            ],
        );
    }

    printf("  %-46s %d espectadores\n", $video->titulo, count($matriculados));
}
