<?php
/**
 * Installer: creates and upgrades the update log table.
 */

defined( 'ABSPATH' ) || exit;

class BW_Update_Server_Installer {

	const TABLE = 'bw_update_log';
	const OPTION_DB_VERSION = 'bw_update_server_db_version';

	public static function table_name() {
		global $wpdb;
		return $wpdb->prefix . self::TABLE;
	}

	public static function activate() {
		self::install_table();
		update_option( self::OPTION_DB_VERSION, BW_UPDATE_SERVER_DB_VERSION );

		if ( ! file_exists( BW_UPDATE_SERVER_UPDATES_DIR ) ) {
			wp_mkdir_p( BW_UPDATE_SERVER_UPDATES_DIR );
		}
	}

	public static function deactivate() {
		// Intentionally no-op. We keep data on deactivation.
	}

	public static function maybe_upgrade() {
		$installed = get_option( self::OPTION_DB_VERSION );
		if ( $installed !== BW_UPDATE_SERVER_DB_VERSION ) {
			self::install_table();
			update_option( self::OPTION_DB_VERSION, BW_UPDATE_SERVER_DB_VERSION );
		}
	}

	private static function install_table() {
		global $wpdb;
		$table           = self::table_name();
		$charset_collate = $wpdb->get_charset_collate();

		$sql = "CREATE TABLE {$table} (
			id BIGINT UNSIGNED AUTO_INCREMENT,
			plugin_slug VARCHAR(64) NOT NULL,
			site_url VARCHAR(255) NOT NULL DEFAULT '',
			installed_version VARCHAR(32) NOT NULL DEFAULT '',
			latest_version VARCHAR(32) NOT NULL DEFAULT '',
			wp_version VARCHAR(32) NOT NULL DEFAULT '',
			php_version VARCHAR(32) NOT NULL DEFAULT '',
			ip_address VARCHAR(64) NOT NULL DEFAULT '',
			user_agent TEXT,
			checked_at DATETIME NOT NULL,
			PRIMARY KEY  (id),
			KEY idx_plugin_slug (plugin_slug),
			KEY idx_site_url (site_url(191)),
			KEY idx_checked_at (checked_at)
		) {$charset_collate};";

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