<?php
/**
 * Plugin Name: Fe Adulta — Evangelio en comentarios
 * Description: Deriva la cita de la carta semanal y muestra la lectura en los comentarios al evangelio.
 * Version: 1.0
 */

function fea_evangelio_category($es_id) {
    return function_exists('fea_cat') ? (int) fea_cat($es_id) : (int) $es_id;
}

function fea_evangelio_comment_categories() {
    return array_map('fea_evangelio_category', [1647, 1646]);
}

function fea_evangelio_is_comment($post_id) {
    return has_category(fea_evangelio_comment_categories(), $post_id);
}

/** Lee el meta del comentario; las traducciones heredan el dato editorial del original ES. */
function fea_evangelio_comment_meta($post_id, $key) {
    $value = get_post_meta($post_id, $key, true);
    if ($value !== '' && $value !== null) return $value;
    if (!function_exists('pll_get_post')) return $value;

    $source_id = (int) pll_get_post((int) $post_id, 'es');
    return $source_id && $source_id !== (int) $post_id
        ? get_post_meta($source_id, $key, true)
        : $value;
}

function fea_evangelio_reading_title($cita) {
    $cita = trim(wp_strip_all_tags((string) $cita));
    if (!preg_match('/^(Mt|Mc|Lc|Jn)\s+(.+)$/u', $cita, $m)) return '';
    $books = ['Mt' => 'MATEO', 'Mc' => 'MARCOS', 'Lc' => 'LUCAS', 'Jn' => 'JUAN'];
    return $books[$m[1]] . ' ' . preg_replace('/\s+/u', ' ', trim($m[2]));
}

/** Localiza la lectura española, sin depender del slug (que puede llevar sufijos). */
function fea_evangelio_reading_id($cita) {
    global $wpdb;
    static $cache = [];
    $title = fea_evangelio_reading_title($cita);
    if ($title === '') return 0;
    if (isset($cache[$title])) return $cache[$title];
    // La coincidencia se hace siempre contra la lectura original en español; después
    // Polylang la sustituye por la traducción del comentario cuando exista.
    $cat = 1645;
    $sql = $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id = p.ID
         INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
         WHERE p.post_type = 'post' AND p.post_status = 'publish' AND p.post_title = %s
           AND tt.taxonomy = 'category' AND tt.term_id = %d
         ORDER BY p.post_date DESC LIMIT 1",
        $title, $cat
    );
    return $cache[$title] = (int) $wpdb->get_var($sql);
}

/** Devuelve los evangelios enlazados en la sección pertinente de una carta. */
function fea_evangelio_from_carta($carta_id) {
    if (!function_exists('fea_parse_carta_sections')) return [];
    if (function_exists('pll_get_post')) $carta_id = (int) (pll_get_post((int) $carta_id, 'es') ?: $carta_id);
    $links = fea_parse_carta_sections((int) $carta_id)['evangelio'] ?? [];
    $result = [];
    foreach ($links as $id) {
        $post = get_post($id);
        if (!$post) continue;
        $cita = get_post_meta($id, '* Cita biblica', true);
        if (!$cita && preg_match('/^(MATEO|MARCOS|LUCAS|JUAN)\s+(.+)$/u', trim($post->post_title), $m)) {
            $abbr = ['MATEO' => 'Mt', 'MARCOS' => 'Mc', 'LUCAS' => 'Lc', 'JUAN' => 'Jn'][$m[1]];
            $cita = $abbr . ' ' . $m[2];
        }
        if (fea_evangelio_reading_title($cita)) $result[(string) $id] = trim($cita);
    }
    return $result;
}

/** Busca una carta en las tres categorías históricas, dentro de cuatro días. */
function fea_evangelio_nearest_carta_id(WP_Post $post) {
    $date = mysql2date('Y-m-d', $post->post_date, false);
    $cartas = get_posts([
        'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 10,
        'category__in' => array_map('fea_evangelio_category', [6, 21, 22]),
        'date_query' => [[
            'after' => date('Y-m-d', strtotime($date . ' -4 days')),
            'before' => date('Y-m-d', strtotime($date . ' +4 days')), 'inclusive' => true,
        ]],
        'orderby' => 'date', 'order' => 'DESC',
    ]);
    if (!$cartas) return 0;
    usort($cartas, function($a, $b) use ($post) {
        return abs(strtotime($a->post_date) - strtotime($post->post_date)) <=> abs(strtotime($b->post_date) - strtotime($post->post_date));
    });
    return (int) $cartas[0]->ID;
}

/** Escribe solo metadatos ausentes cuando la carta identifica un único evangelio. */
function fea_evangelio_capture_meta($post_id) {
    $post = get_post($post_id);
    if (!$post || $post->post_type !== 'post' || $post->post_status !== 'publish' || !fea_evangelio_is_comment($post_id)) return false;
    if (get_post_meta($post_id, '_cita_evangelio', true)) return false;
    $carta_id = (int) get_post_meta($post_id, '_carta_id', true);
    if (!$carta_id) $carta_id = fea_evangelio_nearest_carta_id($post);
    if (!$carta_id) return false;
    $evangelios = fea_evangelio_from_carta($carta_id);
    if (count($evangelios) !== 1) {
        error_log(sprintf('Fe Adulta: comentario %d sin cita; carta %d tiene %d evangelios.', $post_id, $carta_id, count($evangelios)));
        return false;
    }
    update_post_meta($post_id, '_cita_evangelio', reset($evangelios));
    if (!get_post_meta($post_id, '_carta_id', true)) update_post_meta($post_id, '_carta_id', $carta_id);
    return true;
}

function fea_evangelio_summary_label($lang) {
    $labels = [
        'es' => 'Leer el evangelio', 'en' => 'Read the Gospel', 'fr' => 'Lire l’Évangile',
        'it' => 'Leggi il Vangelo', 'pt' => 'Ler o Evangelho',
    ];
    return $labels[$lang] ?? $labels['es'];
}

add_action('transition_post_status', function($new_status, $old_status, $post) {
    if ($new_status === 'publish' && $old_status !== 'publish') fea_evangelio_capture_meta($post->ID);
}, 20, 3);

/** Añade referencia y texto plegado, cerrado por defecto, antes del comentario. */
add_filter('the_content', function($content) {
    if (!is_single() || is_admin()) return $content;
    global $post;
    if (!$post || !fea_evangelio_is_comment($post->ID)) return $content;
    $cita = trim((string) fea_evangelio_comment_meta($post->ID, '_cita_evangelio'));
    if (!$cita) return $content;
    $reading_id = fea_evangelio_reading_id($cita);
    $lang = function_exists('pll_current_language') ? pll_current_language() : 'es';
    if ($reading_id && $lang && $lang !== 'es' && function_exists('pll_get_post')) $reading_id = (int) (pll_get_post($reading_id, $lang) ?: $reading_id);
    $reading = $reading_id ? get_post($reading_id) : null;
    $starts_with_cita = preg_match('/^\s*' . preg_quote($cita, '/') . '(?:[\s\.,:;\-–—]|$)/iu', wp_strip_all_tags($content));
    $html = '<section class="fea-com-evangelio" aria-label="' . esc_attr(fea_evangelio_summary_label($lang)) . '">';
    if (!$starts_with_cita) $html .= '<p class="fea-com-evangelio-cita">' . esc_html($cita) . '</p>';
    if ($reading && trim(wp_strip_all_tags($reading->post_content)) !== '') {
        $html .= '<details class="fea-com-evangelio-details"><summary>' . esc_html(fea_evangelio_summary_label($lang)) . '</summary>'
            . wpautop(do_shortcode($reading->post_content)) . '</details>';
    }
    return $html . '</section>' . $content;
}, 8);

add_action('wp_head', function() {
    if (!is_single()) return;
    global $post;
    if (!$post || !fea_evangelio_is_comment($post->ID)) return;
    ?>
    <style>
    .fea-com-evangelio { margin: 0 0 1.75rem; padding: 1rem 1.15rem; background: #f7f4ed; border-left: 4px solid #a77b2d; }
    .fea-com-evangelio-cita { margin: 0 0 .65rem; font-weight: 700; }
    .fea-com-evangelio-details summary { cursor: pointer; font-weight: 700; color: #51401e; }
    .fea-com-evangelio-details > :last-child { margin-bottom: 0; }
    .fea-com-evangelio-details[open] summary { margin-bottom: .85rem; }
    </style>
    <?php
});
