<?php
if (Picture::queue()->count() > 0) {
/* array con los ids del usuario que envió cada imagen al grupo, ordenado del último al primero */
$ids_users_sent_images = Picture::sent()->orderBy('sent_at', 'desc')->pluck('user_id')->toArray();
$total_tickets = [];
/* para cada usuario, ejecuto lo siguiente */
User::all()->each(function (User $user) use ($ids_users_sent_images, &$total_tickets) {
$pictures_queued = $user->pictures()->queue()->count(); // cuento cuantas tiene en cola cada uno
$images_since_his_last_sent = array_search($user->telegram_id, $ids_users_sent_images) + 1; // miro hace "cuantas" desde la ultima que envió; le sumo 1 porque el array empieza en 0
$num_tickets = min(20, $images_since_his_last_sent) * $pictures_queued; // formula para calcular cuantos "billetes" tiene cada uno
/* en vez de dividir entre el total y sacar aleatorio entre 1 y 0, creo un
array de longitud igual al numero de "billetes" de ese usuario, conteniendo
en cada posicion del array el id del usuario */
$tickets = array_fill(0, $num_tickets, $user->telegram_id);
/* al array global, le añado los resultados parciales de cada uno, de esa forma si yo tengo 50 billetes,
tú tienes 30 y paco 10, al final es un array de 90 elementos, 50 de ellos son mi id de usuario, 30 son tu id
y 10 son el id de paco */
$total_tickets = array_merge($total_tickets, $tickets);
});
/* el ganador es aquel cuyo id figura en la posicion generada aleatoriamente del array de billetes */
$winner = $total_tickets[mt_rand(0, count($total_tickets) - 1)];
/* del usuario elegido, intento cojo una al azar entre las mas antiguas (las ordeno por fecha de creacion y de esas, limito a 10) */
$picture = Picture::queue()->where('user_id', $winner)->orderBy('created_at')->take(10)->get()->random();
// de aqui en adelante, es enviar al grupo y marcar como enviada
$picture->sendToGroup();
$picture->sent_at = Carbon::now();
$picture->save();
}
?>