<?php
/**
 * Ciclo carta nueva — ROTACIÓN de la "carta de la semana" en TODOS los idiomas.
 *
 * Rotación (en este orden, para no perder ninguna):
 *   1) la que estaba en "semana pasada"  -> queda solo en "otras semanas"
 *   2) la que estaba en "semana actual"  -> pasa a "semana pasada"
 *   3) la carta NUEVA                    -> pasa a "semana actual"
 *
 * Robusto/autocorrige: la NUEVA es el parámetro CARTA; la "semana pasada" se
 * deriva como la carta publicada más reciente que NO es la nueva (por fecha),
 * no por quién estuviera en el término (que puede estar roto). Garantiza
 * count=1 en "actual" y count=1 en "pasada" por idioma. "Otras semanas" (21)
 * es el cajón base que conservan TODAS las cartas.
 *
 * Términos ES base (se derivan por Polylang a cada idioma):
 *   actual = 6 (cartasemana) | pasada = 22 (carta-semana-pasada) | otras = 21
 *
 * Uso:  CARTA=<es_id> php rotate_cartas.php           (dry-run)
 *       APPLY=1 CARTA=<es_id> php rotate_cartas.php
 */
require getenv('FEA_WP_LOAD') ?: '/var/www/html/wp-load.php';
$APPLY = getenv('APPLY') === '1';
$CARTA = (int)(getenv('CARTA') ?: 0);
if (!$CARTA) { fwrite(STDERR, "Falta CARTA=<es_id>\n"); exit(1); }

$actual_terms = pll_get_term_translations(6);
$pasada_terms = pll_get_term_translations(22);
$otras_terms  = pll_get_term_translations(21);
$carta_tr     = pll_get_post_translations($CARTA);

function cartas_en($terms) { // posts publish en cualquiera de esos términos (mismo idioma), por fecha desc
    return get_posts(['post_type'=>'post','post_status'=>'publish','numberposts'=>-1,'fields'=>'ids',
        'orderby'=>'date','order'=>'DESC','suppress_filters'=>true,
        'tax_query'=>[['taxonomy'=>'category','field'=>'term_id','terms'=>array_values(array_filter($terms))]]]);
}

foreach ($actual_terms as $lang => $t_actual) {
    $t_pasada = (int)($pasada_terms[$lang] ?? 0);
    $t_otras  = (int)($otras_terms[$lang] ?? 0);
    $t_actual = (int)$t_actual;
    $new      = (int)($carta_tr[$lang] ?? 0);

    // Conjunto de cartas de ESTE idioma (los términos ya son por idioma) por fecha desc.
    $all  = cartas_en([$t_actual, $t_pasada, $t_otras]);
    // "semana pasada" = la más reciente que no es la nueva.
    $prev = 0; foreach ($all as $pid) { if ($pid != $new) { $prev = $pid; break; } }

    // Posts actualmente marcados como actual/pasada (conjunto pequeño a limpiar).
    $flagged = get_posts(['post_type'=>'post','post_status'=>'any','numberposts'=>-1,'fields'=>'ids',
        'suppress_filters'=>true,
        'tax_query'=>[['taxonomy'=>'category','field'=>'term_id','terms'=>array_values(array_filter([$t_actual,$t_pasada]))]]]);

    if ($APPLY) {
        // 1) limpiar: quitar actual+pasada de cualquiera salvo los dos destinos.
        foreach ($flagged as $pid) {
            if ($pid == $new || $pid == $prev) continue;
            wp_remove_object_terms($pid, array_values(array_filter([$t_actual,$t_pasada])), 'category');
        }
        // 2) NUEVA -> semana actual (y fuera de pasada). Mantener otras.
        if ($new) {
            wp_set_object_terms($new, [$t_actual], 'category', true);
            if ($t_pasada) wp_remove_object_terms($new, [$t_pasada], 'category');
            if ($t_otras)  wp_set_object_terms($new, [$t_otras], 'category', true);
        }
        // 3) ANTERIOR -> semana pasada (y fuera de actual). Mantener otras.
        if ($prev && $t_pasada) {
            wp_set_object_terms($prev, [$t_pasada], 'category', true);
            wp_remove_object_terms($prev, [$t_actual], 'category');
            if ($t_otras) wp_set_object_terms($prev, [$t_otras], 'category', true);
        }
        clean_term_cache(array_filter([$t_actual,$t_pasada,$t_otras]), 'category');
    }

    $cleaned = count(array_diff($flagged, [$new, $prev]));
    $tn = $new  ? get_post($new)  : null;
    $tp = $prev ? get_post($prev) : null;
    printf("%s: actual=#%d «%s» | pasada=#%d «%s» | degradadas a 'otras' %d post(s)%s\n",
        strtoupper($lang), $new, $tn?mb_substr($tn->post_title,0,26):'-',
        $prev, $tp?mb_substr($tp->post_title,0,26):'-',
        $cleaned, $APPLY?'':'  [DRY-RUN]');
}
echo $APPLY ? "APLICADO\n" : "DRY-RUN (APPLY=1 para aplicar)\n";
