<?php 
if (!class_exists('WP_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}

function view_member_list_initialisation()
{
    echo "
    <script>
        document.addEventListener('DOMContentLoaded', function() {
            document.getElementById('bulk-action-selector-top').disabled = true;
            document.getElementById('doaction').disabled = true;
            document.getElementById('bulk-action-selector-bottom').disabled = true;
            document.getElementById('doaction2').disabled = true;
        });
    </script>
    ";

    $table = new CASS_View_Member_List();
    ?>
    <div class="wrap">
        <h2>Liste des membres</h2>
        <?php 
         // Ajouter la boîte de recherche
        $table->search_box('Rechercher par nom', 'lastname');
        ?>
        <?php
        $table->prepare_items();
        echo "<form id='cass-admin-race-list' method='post'>";
        $table->display();
        echo "</form>";
    ?>
    
    </div>
    <?php
}

class CASS_View_Member_List extends WP_List_Table
{
    private $table_data;

    function get_columns()
    {
        $columns = array(
            'role' => __('Rôle','role-content'),
            'lastname' => __('Nom', 'cass-race-lastname-content'),
            'firstname' => __('Prénom', 'cass-race-firstname-content'),
            'cassMemberNo' => __('Numéro de membre', 'cass-race-member-no-content'),
            'cassLevel' => __('Niveau', 'cass-race-level-content'),
            'cassLevelTechSki' => __('Niveau ski', 'cass-race-level-tech-ski-content'),
            'cassLevelClimbing' => __('Niveau escalade','cass-race-level-climbing-content'),
            'cassLevelMountaineering' => __('Niveau alpinitme', 'cass-race-level-mountaineering-content'),
            'cassGroup' => __('Groupe', 'cass-race-group-content'),
            'cassTelephone' => __('Téléphone', 'cass-race-telephone-content'),
            'cassAddress' => __('Adresse', 'cass-race-address-content'),
            'cassNPA' => __('Code postal', 'cass-race-npa-content'),
            'cassLocality' => __('Localité', 'cass-race-locality-content'),
            'email' => __('Email', 'cass-race-email-content'),
        );
        return $columns;
    }

    public function prepare_items($search = '')
{

    $search = isset($_POST['s']) ? sanitize_text_field($_POST['s']) : '';

    $this->table_data = $this->get_table_data($search);

    $columns = $this->get_columns();
    $hidden = array();
    $sortable = $this->get_sortable_columns();
    $this->_column_headers = array(
        $this->get_columns(),
        array(), // Colonnes masquées
        $this->get_sortable_columns()
    );
    
    usort($this->table_data, array(&$this, 'usort_reorder'));

    $per_page = 20;
    $current_page = $this->get_pagenum();
    $total_items = count($this->table_data);

    // Découper les données pour la pagination
    $this->table_data = array_slice($this->table_data, (($current_page - 1) * $per_page), $per_page);

    $this->set_pagination_args(
        array(
            'total_items' => $total_items,
            'per_page' => $per_page,
            'total_pages' => ceil($total_items / $per_page),
        )
    );

    $this->items = $this->table_data;
}

    

private function get_table_data($search = '')
{
    // Récupérer les données des membres
    $members = Member::sqlWPTable();

    // Initialiser un tableau pour stocker les données filtrées
    $filtered_data = array();

    // Parcourir les membres et appliquer le filtre
    foreach ($members as $member) {
        if (empty($search) || stripos($member->getLastname(), $search) !== false) {
            $filtered_data[] = $member;
        }
    }

    // Retourner les données filtrées
    return $filtered_data;
}

    function column_default($item, $column_name)
    {
        switch ($column_name) {
            case 'role':
                return $item->getRole();
            case 'lastname':
                return $item->getLastname();
            case 'firstname':
                return $item->getFirstname();
            case 'cassMemberNo':
                return $item->getCassMemberNo();
            case 'cassLevel':
                return $item->getCassLevel();
            case 'cassLevelTechSki':
                return $item->getCassLevelTechSki();
            case 'cassLevelClimbing':
                return $item->getCassLevelClimbing();
            case 'cassLevelMountaineering':
                return $item->getCassLevelMountaineering();
            case 'cassGroup':
                return $item->getCassGroup();
            case 'cassTelephone':
                return $item->getCassTelephone();
            case 'cassAddress':
                return $item->getCassAddress();
            case 'cassNPA':
                return $item->getCassNPA();
            case 'cassLocality':
                return $item->getCassLocality();
            case 'email':
                return $item->getEmail();
            default:
                return ''; // Valeur par défaut pour les colonnes non définies
        }
    }

    public function get_sortable_columns()
    {
        $sortable_columns = array(
            'role' => array('role', false),
            'lastname' => array('lastname', true),
            'firstname' => array('firstname', false),
            'cassMemberNo' => array('cassMemberNo', false),
            'cassLevel' => array('cassLevel', false),
            'cassLevelTechSki' => array('cassLevelTechSki', false),
            'cassLevelClimbing' => array('cassLevelClimbing', false),
            'cassLevelMountaineering' => array('cassLevelMountaineering', false),
            'cassGroup' => array('cassGroup', false),
            'cassTelephone' => array('cassTelephone', false),
            'email' => array('email', false),
        );
        return $sortable_columns;
    }

    function usort_reorder($a, $b)
{
    // Vérifie si une colonne de tri a été spécifiée dans l'URL, sinon utilise 'lastname' par défaut
    $orderby = !empty($_GET['orderby']) ? $_GET['orderby'] : 'lastname';

    // Vérifie si un ordre a été spécifié dans l'URL, sinon utilise 'asc' par défaut
    $order = !empty($_GET['order']) ? $_GET['order'] : 'asc';

    // Compare les valeurs des colonnes en fonction de 'orderby'
    switch ($orderby) {
        case 'lastname':
            $result = strcmp($a->getLastname(), $b->getLastname());
            break;
        case 'firstname':
            $result = strcmp($a->getFirstname(), $b->getFirstname());
            break;
        case 'role':
            $result = strcmp($a->getRole(), $b->getRole());
            break;
        case 'cassMemberNo':
            $result = strcmp($a->getCassMemberNo(), $b->getCassMemberNo());
            break;
        case 'cassLevel':
            $result = strcmp($a->getCassLevel(), $b->getCassLevel());
            break;
        case 'cassLevelTechSki':
            $result = strcmp($a->getCassLevelTechSki(), $b->getCassLevelTechSki());
            break;
        case 'cassLevelClimbing':
            $result = strcmp($a->getCassLevelClimbing(), $b->getCassLevelClimbing());
            break;
        case 'cassLevelMountaineering':
            $result = strcmp($a->getCassLevelMountaineering(), $b->getCassLevelMountaineering());
            break;
        case 'cassGroup':
            $result = strcmp($a->getCassGroup(), $b->getCassGroup());
            break;
        case 'cassTelephone':
            $result = strcmp($a->getCassTelephone(), $b->getCassTelephone());
            break;
        case 'cassAddress':
            $result = strcmp($a->getCassAddress(), $b->getCassAddress());
            break;
        case 'cassNPA':
            $result = strcmp($a->getCassNPA(), $b->getCassNPA());
            break;
        case 'cassLocality':
            $result = strcmp($a->getCassLocality(), $b->getCassLocality());
            break;
        case 'email':
            $result = strcmp($a->getEmail(), $b->getEmail());
            break;
        default:
            $result = 0; // Aucun tri si la colonne n'est pas reconnue
            break;
    }

    // Retourne le résultat en fonction de l'ordre spécifié
    return ($order === 'asc') ? $result : -$result;
}

    

    function column_lastname($item)
    {
        $ID_WPUser = $item->getID();
        $actions = array(   
            'allCourses' => sprintf('<a href="' . admin_url() . "admin.php?page=cass-admin-race-user-all-courses-list&element=" . $ID_WPUser . '">Liste de ses courses</a>', $_REQUEST['page'], 'allCourses', $ID_WPUser),
        );

        return sprintf('%1$s %2$s', ReadGlobal($item->getLastname()), $this->row_actions($actions));

    }

    function column_firstname($item)
    {
        return $item->getFirstname();
    }

    function search_box($text, $input_id)
    {
     

        $input_id = $input_id . '-search-input';

        echo '<form method="post">';
        echo '<p class="search-box">';
        echo '<label class="screen-reader-text" for="' . esc_attr($input_id) . '">' . $text . ':</label>';
        echo '<input type="search" id="' . esc_attr($input_id) . '" name="s" value="' . esc_attr($_REQUEST['s'] ?? '') . '" />';
        echo '<button type="submit" class="button">' . esc_attr($text) . '</button>';
        echo '</p>';
        echo '</form>';
    }
}
