<?php

/**
 * Service de gestion des sauvegardes JSON
 * 
 * @package WB_Onboard
 * @since 1.0.0
 */
class WB_Backup_Service
{

  /**
   * Nom de la table de backup
   */
  const TABLE_NAME = 'wb_json_backup';

  /**
   * Créer la table de backup si elle n'existe pas
   */
  public static function create_table()
  {
    global $wpdb;

    $table_name = $wpdb->prefix . self::TABLE_NAME;

    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            created_at timestamp DEFAULT CURRENT_TIMESTAMP,
            json_data longtext NOT NULL,
            user_id bigint(20) UNSIGNED NOT NULL,
            PRIMARY KEY (id),
            KEY created_at (created_at),
            KEY user_id (user_id)
        ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);

    // Vérifier que la table a été créée
    if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
      error_log("Erreur: Impossible de créer la table $table_name");
      return false;
    }

    return true;
  }

  /**
   * Ajouter une entrée JSON dans la table de backup
   * 
   * @param array $json_data Les données à sauvegarder
   * @param int $user_id ID de l'utilisateur (optionnel, utilise l'utilisateur actuel par défaut)
   * @return int|false ID de l'entrée créée ou false en cas d'erreur
   */
  public static function add_json($json_data, $user_id = null)
  {
    global $wpdb;

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

    $table_name = $wpdb->prefix . self::TABLE_NAME;

    $result = $wpdb->insert(
      $table_name,
      [
        'json_data' => wp_json_encode($json_data),
        'user_id' => $user_id,
        'created_at' => current_time('mysql')
      ],
      ['%s', '%d', '%s']
    );

    if ($result === false) {
      error_log("Erreur lors de l'insertion dans $table_name: " . $wpdb->last_error);
      return false;
    }

    return $wpdb->insert_id;
  }

  /**
   * Obtenir le temps écoulé depuis la dernière entrée
   * 
   * @param int $user_id ID de l'utilisateur (optionnel, utilise l'utilisateur actuel par défaut)
   * @return int Nombre de secondes depuis la dernière entrée, ou 999999 si aucune entrée
   */
  public static function time_from_last_entry($user_id = null)
  {
    global $wpdb;

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

    $table_name = $wpdb->prefix . self::TABLE_NAME;

    $last_entry = $wpdb->get_var($wpdb->prepare(
      "SELECT created_at FROM $table_name WHERE user_id = %d ORDER BY created_at DESC LIMIT 1",
      $user_id
    ));

    if (!$last_entry) {
      return 999999; // Aucune entrée trouvée
    }

    $last_timestamp = strtotime($last_entry);
    $current_timestamp = time();

    return $current_timestamp - $last_timestamp;
  }

  /**
   * Obtenir la dernière sauvegarde pour un utilisateur
   * 
   * @param int $user_id ID de l'utilisateur (optionnel, utilise l'utilisateur actuel par défaut)
   * @return array|null Dernière sauvegarde ou null si aucune
   */
  public static function get_last_backup($user_id = null)
  {
    global $wpdb;

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

    $table_name = $wpdb->prefix . self::TABLE_NAME;

    $result = $wpdb->get_row($wpdb->prepare(
      "SELECT * FROM $table_name WHERE user_id = %d ORDER BY created_at DESC LIMIT 1",
      $user_id
    ), ARRAY_A);

    if ($result) {
      $result['json_data'] = json_decode($result['json_data'], true);
    }

    return $result;
  }


  /**
   * Vérifier si la table existe
   * 
   * @return bool True si la table existe, false sinon
   */
  public static function table_exists()
  {
    global $wpdb;

    $table_name = $wpdb->prefix . self::TABLE_NAME;
    return $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name;
  }
}
