<?php

/**
 * Service de gestion du leadership
 * 
 * @package WB_Onboard
 * @since 1.0.0
 */
class WB_Leader_Service
{

  /**
   * Nom de l'option WordPress pour le leader
   */
  const LEADER_OPTION = 'wb_current_leader';

  /**
   * Timeout en secondes (1 minute)
   */
  const LEADER_TIMEOUT = 60;

  /**
   * Obtenir les informations du leader actuel
   * 
   * @return array|null Informations du leader ou null si aucun
   */
  public static function get_current_leader()
  {
    $leader_data = get_option(self::LEADER_OPTION, null);

    if (!$leader_data) {
      return null;
    }

    // Vérifier si le leader n'a pas expiré
    if (self::is_leader_expired($leader_data)) {
      self::clear_leader();
      return null;
    }

    return $leader_data;
  }

  /**
   * Vérifier si un page_id est le leader actuel
   * 
   * @param string $page_id ID de la page à vérifier
   * @return bool True si c'est le leader, false sinon
   */
  public static function is_leader($page_id)
  {
    $leader = self::get_current_leader();

    return $leader && $leader['page_id'] === $page_id;
  }

  /**
   * Définir un nouveau leader
   * 
   * @param string $page_id ID de la page qui devient leader
   * @param int $user_id ID de l'utilisateur (optionnel, utilise l'utilisateur actuel par défaut)
   * @return bool True si le leadership a été pris, false sinon
   */
  public static function claim_leadership($page_id, $user_id = null)
  {
    if (empty($page_id)) {
      return false;
    }

    if ($user_id === null) {
      $user_id = get_current_user_id();
    }

    $current_leader = self::get_current_leader();

    // Si c'est déjà nous le leader, on met juste à jour le timestamp
    if ($current_leader && $current_leader['page_id'] === $page_id) {
      return self::update_leader_timestamp($page_id, $user_id);
    }

    // Si aucun leader ou leader expiré, on peut prendre le leadership
    if (!$current_leader) {
      return self::set_leader($page_id, $user_id);
    }

    return false; // Un autre leader est actif
  }

  /**
   * Forcer le leadership (pour le bouton "Devenir leader")
   * 
   * @param string $page_id ID de la page qui devient leader
   * @param int $user_id ID de l'utilisateur (optionnel, utilise l'utilisateur actuel par défaut)
   * @return bool True si le leadership a été pris
   */
  public static function force_claim_leadership($page_id, $user_id = null)
  {
    if (empty($page_id)) {
      return false;
    }

    if ($user_id === null) {
      $user_id = get_current_user_id();
    }

    return self::set_leader($page_id, $user_id);
  }

  /**
   * Obtenir le temps écoulé depuis la dernière activité du leader
   * 
   * @return int Nombre de secondes, ou 999999 si aucun leader
   */
  public static function time_since_last_activity()
  {
    $leader = self::get_current_leader();

    if (!$leader) {
      return 999999;
    }

    return time() - $leader['last_activity'];
  }

  /**
   * Vérifier si le leader actuel a expiré
   * 
   * @param array $leader_data Données du leader à vérifier
   * @return bool True si expiré, false sinon
   */
  private static function is_leader_expired($leader_data)
  {
    if (!isset($leader_data['last_activity'])) {
      return true;
    }

    return (time() - $leader_data['last_activity']) > self::LEADER_TIMEOUT;
  }

  /**
   * Définir un leader
   * 
   * @param string $page_id ID de la page
   * @param int $user_id ID de l'utilisateur
   * @return bool True si réussi
   */
  private static function set_leader($page_id, $user_id)
  {
    $leader_data = [
      'page_id' => $page_id,
      'user_id' => $user_id,
      'last_activity' => time(),
      'claimed_at' => current_time('mysql')
    ];

    return update_option(self::LEADER_OPTION, $leader_data);
  }

  /**
   * Mettre à jour le timestamp du leader actuel
   * 
   * @param string $page_id ID de la page (pour vérification)
   * @param int $user_id ID de l'utilisateur
   * @return bool True si réussi
   */
  private static function update_leader_timestamp($page_id, $user_id)
  {
    $leader_data = get_option(self::LEADER_OPTION);

    if (!$leader_data || $leader_data['page_id'] !== $page_id) {
      return false;
    }

    $leader_data['last_activity'] = time();
    $leader_data['user_id'] = $user_id; // Mise à jour au cas où

    return update_option(self::LEADER_OPTION, $leader_data);
  }

  /**
   * Supprimer le leader actuel
   * 
   * @return bool True si réussi
   */
  public static function clear_leader()
  {
    return delete_option(self::LEADER_OPTION);
  }

  /**
   * Obtenir les statistiques du leadership
   * 
   * @return array Statistiques pour debug
   */
  public static function get_stats()
  {
    $leader = self::get_current_leader();

    if (!$leader) {
      return [
        'has_leader' => false,
        'time_since_last' => 999999
      ];
    }

    return [
      'has_leader' => true,
      'page_id' => substr($leader['page_id'], -8),
      'user_id' => $leader['user_id'],
      'time_since_last' => time() - $leader['last_activity'],
      'claimed_at' => $leader['claimed_at'],
      'expires_in' => self::LEADER_TIMEOUT - (time() - $leader['last_activity'])
    ];
  }

  /**
   * Mettre à jour l'activité du leader (simple ping)
   * 
   * @param string $page_id ID de la page pour vérification
   * @return bool True si mis à jour, false sinon
   */
  public static function update_leader_activity($page_id)
  {
    if (empty($page_id)) {
      return false;
    }

    // Vérifier qu'on est bien le leader
    if (!self::is_leader($page_id)) {
      return false;
    }

    $leader_data = get_option(self::LEADER_OPTION);
    if (!$leader_data || $leader_data['page_id'] !== $page_id) {
      return false;
    }

    // Juste mettre à jour le timestamp
    $leader_data['last_activity'] = time();

    return update_option(self::LEADER_OPTION, $leader_data);
  }
}
