<?php

/**
 * Custom Post Type: Agenda
 * Modernized for WordPress 6.0+
 */

// Prevent direct access
if (!defined('ABSPATH')) {
    exit;
}

/**
 * Fonction utilitaire pour formater les dates
 */
function agenda_format_date_display($date_string)
{
    if (strlen($date_string) === 8) {
        return substr($date_string, 6, 2) . '/' . substr($date_string, 4, 2) . '/' . substr($date_string, 0, 4);
    }
    return $date_string;
}

// Création du TCP
function init_CPT_Agenda()
{
    $labels = array(
        'name' => _x('Agenda', 'Post type general name', 'ornex-tuatam'),
        'singular_name' => _x('Événement', 'Post type singular name', 'ornex-tuatam'),
        'add_new' => _x('Ajouter', 'événement', 'ornex-tuatam'),
        'add_new_item' => __('Ajouter un événement', 'ornex-tuatam'),
        'edit_item' => __('Modifier l\'événement', 'ornex-tuatam'),
        'new_item' => __('Nouvel événement', 'ornex-tuatam'),
        'all_items' => __('Tous les événements', 'ornex-tuatam'),
        'view_item' => __('Voir l\'événement', 'ornex-tuatam'),
        'view_items' => __('Voir les événements', 'ornex-tuatam'),
        'search_items' => __('Rechercher des événements', 'ornex-tuatam'),
        'not_found' => __('Aucun événement trouvé', 'ornex-tuatam'),
        'not_found_in_trash' => __('Aucun événement trouvé dans la corbeille', 'ornex-tuatam'),
        'parent_item_colon' => '',
        'menu_name' => __('Agenda', 'ornex-tuatam'),
        'featured_image' => __('Image de l\'événement', 'ornex-tuatam'),
        'set_featured_image' => __('Définir l\'image de l\'événement', 'ornex-tuatam'),
        'remove_featured_image' => __('Supprimer l\'image de l\'événement', 'ornex-tuatam'),
        'use_featured_image' => __('Utiliser comme image de l\'événement', 'ornex-tuatam'),
        'archives' => __('Archives de l\'agenda', 'ornex-tuatam'),
        'insert_into_item' => __('Insérer dans l\'événement', 'ornex-tuatam'),
        'uploaded_to_this_item' => __('Téléchargé vers cet événement', 'ornex-tuatam'),
        'filter_items_list' => __('Filtrer la liste des événements', 'ornex-tuatam'),
        'items_list_navigation' => __('Navigation de la liste des événements', 'ornex-tuatam'),
        'items_list' => __('Liste des événements', 'ornex-tuatam'),
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_rest' => true,
        'query_var' => true,
        'rewrite' => array('slug' => 'agenda'),
        'has_archive' => true,
        //    	'hierarchical' => false,
        'menu_position' => 20,
        'menu_icon' => 'dashicons-calendar',
        'supports' => array('title', 'editor', 'thumbnail', 'revisions'),
    );

    // Enregistrement du TCP
    register_post_type('agenda', $args);

    // Labels des rubriques.
    $rubLabels = array(
        'name' => 'Thématiques',
        'singular_name' => 'Thématique',
        'search_items' => 'Rechercher',
        'popular_items' => 'Thématiques souvent utilisées',
        'all_items' => 'Toutes les thématiques',
        'edit_item' => 'Modifier une thématique',
        'update_item' => 'Mettre à jour une thématique',
        'add_new_item' => 'Ajouter une thématique',
        'new_item_name' => 'Nouvelle thématique'
    );

    // Rubriques.
    register_taxonomy('agenda-thematique', 'agenda', array(
        'hierarchical' => true,
        'label' => 'Thématiques',
        'labels' => $rubLabels,
        'rewrite' => array('slug' => 'agenda-thematique'),
        'show_in_nav_menus' => false,
        'show_admin_column' => true
    ));
}

add_action('init', 'init_CPT_Agenda', 0);

/**
 * Ajout de champs personnalisés à l'API REST
 */
add_action('rest_api_init', 'agenda_register_rest_fields');

function agenda_register_rest_fields()
{
    // Image à la une
    register_rest_field('agenda', 'featured_image_url', array(
        'get_callback' => function ($post) {
            $image_id = get_post_thumbnail_id($post['id']);
            if ($image_id) {
                $image = wp_get_attachment_image_src($image_id, 'full');
                return $image ? $image[0] : null;
            }
            return null;
        },
        'schema' => array(
            'description' => __('URL de l\'image de l\'événement', 'ornex-tuatam'),
            'type' => 'string',
            'format' => 'uri',
            'context' => array('view', 'edit'),
        ),
    ));

    // Dates de l'événement
    register_rest_field('agenda', 'event_dates', array(
        'get_callback' => function ($post) {
            $datedebut = get_post_meta($post['id'], 'datedebut', true);
            $datefin = get_post_meta($post['id'], 'datefin', true);

            $dates = array(
                'start_date' => null,
                'end_date' => null,
                'start_date_formatted' => null,
                'end_date_formatted' => null,
                'is_past' => false,
                'is_current' => false,
                'is_future' => false,
            );

            if ($datedebut && strlen($datedebut) === 8) {
                $dates['start_date'] = substr($datedebut, 0, 4) . '-' . substr($datedebut, 4, 2) . '-' . substr($datedebut, 6, 2);
                $dates['start_date_formatted'] = agenda_format_date_display($datedebut);
            }

            if ($datefin && strlen($datefin) === 8) {
                $dates['end_date'] = substr($datefin, 0, 4) . '-' . substr($datefin, 4, 2) . '-' . substr($datefin, 6, 2);
                $dates['end_date_formatted'] = agenda_format_date_display($datefin);
            }

            // Déterminer le statut de l'événement
            if ($datedebut && $datefin) {
                $datejour = current_time('Ymd');
                $dates['is_past'] = ($datejour > $datefin);
                $dates['is_current'] = ($datejour >= $datedebut && $datejour <= $datefin);
                $dates['is_future'] = ($datejour < $datedebut);
            }

            return $dates;
        },
        'schema' => array(
            'description' => __('Dates de l\'événement', 'ornex-tuatam'),
            'type' => 'object',
            'context' => array('view', 'edit'),
        ),
    ));

    // Thématiques
    register_rest_field('agenda', 'thematiques_details', array(
        'get_callback' => function ($post) {
            $terms = get_the_terms($post['id'], 'agenda-thematique');
            if (empty($terms) || is_wp_error($terms)) {
                return array();
            }

            $thematiques = array();
            foreach ($terms as $term) {
                $thematiques[] = array(
                    'id' => $term->term_id,
                    'name' => $term->name,
                    'slug' => $term->slug,
                    'description' => $term->description,
                    'link' => get_term_link($term),
                );
            }
            return $thematiques;
        },
        'schema' => array(
            'description' => __('Détails des thématiques', 'ornex-tuatam'),
            'type' => 'array',
            'context' => array('view', 'edit'),
        ),
    ));
}

add_filter('manage_edit-agenda_columns', 'my_edit_agenda_columns');

function my_edit_agenda_columns($columns)
{
    $columns = array(
        'cb' => '<input type="checkbox" />',
        'title' => __('Titre'),
        'agenda-thematique' => __('Thématique(s)'),
        'datedebut' => __('Date de début'),
        'datefin' => __('Date de fin'),
        'date' => __('Date de publication')
    );
    return $columns;
}

// Remplissage des lignes du tableau
add_action('manage_agenda_posts_custom_column', 'my_manage_agenda_columns', 10, 2);

function my_manage_agenda_columns($column, $post_id)
{
    switch ($column) {
        case 'agenda-thematique':
            $terms = get_the_terms($post_id, 'agenda-thematique');
            if (!empty($terms) && !is_wp_error($terms)) {
                $term_links = array();
                foreach ($terms as $term) {
                    $term_links[] = sprintf(
                        '<a href="%s">%s</a>',
                        esc_url(add_query_arg(array(
                            'post_type' => get_post_type($post_id),
                            'agenda-thematique' => $term->slug
                        ), 'edit.php')),
                        esc_html($term->name)
                    );
                }
                echo implode(', ', $term_links);
            } else {
                echo '<span aria-hidden="true">—</span><span class="screen-reader-text">' . __('Aucune thématique', 'ornex-tuatam') . '</span>';
            }
            break;

        case 'datedebut':
            $dateDebut = get_post_meta($post_id, 'datedebut', true);
            if ($dateDebut) {
                $formatted_date = agenda_format_date_display($dateDebut);
                echo esc_html($formatted_date);
            } else {
                echo '<span aria-hidden="true">—</span><span class="screen-reader-text">' . __('Aucune date de début', 'ornex-tuatam') . '</span>';
            }
            break;

        case 'datefin':
            $dateFin = get_post_meta($post_id, 'datefin', true);
            if ($dateFin) {
                $dateJour = current_time('Ymd');
                $formatted_date = agenda_format_date_display($dateFin);

                if ($dateJour > $dateFin) {
                    echo '<span class="agenda-date-expired">' . esc_html($formatted_date) . ' <em>(' . __('terminé', 'ornex-tuatam') . ')</em></span>';
                } else {
                    echo '<span class="agenda-date-active">' . esc_html($formatted_date) . '</span>';
                }
            } else {
                echo '<span aria-hidden="true">—</span><span class="screen-reader-text">' . __('Aucune date de fin', 'ornex-tuatam') . '</span>';
            }
            break;
    }
}

// Enregistrer la meta box dates début/fin
function meta_box_agenda()
{
    add_meta_box('a111-meta-box', 'Pérennité de ce contenu', 'create_meta_box_agenda', 'agenda', 'side', 'high');
}

add_action('add_meta_boxes', 'meta_box_agenda');

// création de la boite méta
function create_meta_box_agenda($post)
{
    // Afficher les dates déjà enregistrées (le cas échéant).
    $datedebut = get_post_meta($post->ID, 'datedebut', true);
    $datefin = get_post_meta($post->ID, 'datefin', true);

    // Utilisation de Nonce pour la vérification des champs (sécurité)
    wp_nonce_field(plugin_basename(__FILE__), 'nonce');
    // Opérations sur les dates pour obtenir un format de comparaison
    $datejour = date('Ymd');
    if ($datefin != '') {
        if ($datejour > $datefin) {
            // C'est fini
            echo '<p style="color: #c00;">Ce contenu ne s\'affiche plus sur le site car sa date de fin est inférieure à celle d\'aujourd\'hui.<br /><br />Vous pouvez modifier ces dates si vous le souhaitez.</p>';
        } else {
            // C'est encore d'actualité
            echo '<p style="color: #0c0;">Ce contenu est actuellement affiché sur le site. Vous pouvez modifier les dates de début et de fin à volonté.</p>';
        }
    }
?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('.datepicker').datepicker({
                dateFormat: 'dd/mm/yy'
            });
        });

        function verifDate() {
            var dateDebut = $.datepicker.parseDate('dd/mm/yy', $("#date-debut").val());
            var dateFin = $.datepicker.parseDate('dd/mm/yy', $("#date-fin").val());
            if (dateDebut > dateFin) {
                alert("Date de fin inférieure à date de début");
                document.getElementById("date-fin").setAttribute("style", "border-color:red");
                document.getElementById("publish").disabled = true;
            } else {
                document.getElementById("date-fin").setAttribute("style", "border-color:#eee");
                document.getElementById("publish").disabled = false;
            }
        }
    </script>
    <p>Date de début : <br /><input class="datepicker" id="date-debut" name="date-debut" type="text" value="<?php if ($datedebut) {
                                                                                                                echo substr($datedebut, 6, 2) . '/' . substr($datedebut, 4, 2) . '/' . substr($datedebut, 0, 4);
                                                                                                            } ?>" /></p>
    <p>Date de fin : <br /><input onchange="verifDate()" class="datepicker" id="date-fin" name="date-fin" type="text" value="<?php if ($datefin) {
                                                                                                                                    echo substr($datefin, 6, 2) . '/' . substr($datefin, 4, 2) . '/' . substr($datefin, 0, 4);
                                                                                                                                } ?>" /></p>
    <p style="font-style: italic; color: #777;">La date de fin est utilisée pour l'arrêt de l'affichage du contenu sur le site.</p>
<?php
}

/**
 * Sauvegarde des métadonnées
 */
add_action('save_post', 'agenda_save_meta_box_data');

function agenda_save_meta_box_data($post_id)
{
    // Vérifications de sécurité
    if (!isset($_POST['agenda_dates_nonce']) || !wp_verify_nonce($_POST['agenda_dates_nonce'], 'agenda_dates_meta_box')) {
        return;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (get_post_type($post_id) !== 'agenda') {
        return;
    }

    // Sauvegarde des dates
    if (isset($_POST['agenda_date_debut'])) {
        $date_debut = sanitize_text_field($_POST['agenda_date_debut']);
        if ($date_debut) {
            $formatted_date = date('Ymd', strtotime($date_debut));
            update_post_meta($post_id, 'datedebut', $formatted_date);
            update_post_meta($post_id, 'tridatedebut', $formatted_date);
        } else {
            delete_post_meta($post_id, 'datedebut');
            delete_post_meta($post_id, 'tridatedebut');
        }
    }

    if (isset($_POST['agenda_date_fin'])) {
        $date_fin = sanitize_text_field($_POST['agenda_date_fin']);
        if ($date_fin) {
            $formatted_date = date('Ymd', strtotime($date_fin));
            update_post_meta($post_id, 'datefin', $formatted_date);
        } else {
            delete_post_meta($post_id, 'datefin');
        }
    }
}

/**
 * Ajout de styles pour l'administration
 */
add_action('admin_head', 'agenda_admin_styles');

function agenda_admin_styles()
{
    global $post_type;
    if ($post_type === 'agenda') {
        echo '<style>
        .agenda-date-expired { color: #dc3232; }
        .agenda-date-active { color: #00a32a; }
        .agenda-date-error { color: #dc3232; font-size: 12px; margin-top: 5px; }
        </style>';
    }
}

/**
 * Ajout de colonnes triables
 */
add_filter('manage_edit-agenda_sortable_columns', 'agenda_sortable_columns');

function agenda_sortable_columns($columns)
{
    $columns['datedebut'] = 'datedebut';
    $columns['datefin'] = 'datefin';
    $columns['agenda-thematique'] = 'agenda-thematique';
    return $columns;
}

/**
 * Gestion du tri personnalisé
 */
add_action('pre_get_posts', 'agenda_posts_orderby');

function agenda_posts_orderby($query)
{
    if (!is_admin() || !$query->is_main_query()) {
        return;
    }

    $orderby = $query->get('orderby');

    if ('datedebut' === $orderby) {
        $query->set('meta_key', 'datedebut');
        $query->set('orderby', 'meta_value');
    } elseif ('datefin' === $orderby) {
        $query->set('meta_key', 'datefin');
        $query->set('orderby', 'meta_value');
    }
}
