<?php
function wp_statistics_purge_data( $purge_days ) {
	global $wpdb, $WP_Statistics;

	// If it's less than 30 days, don't do anything.
	if ( $purge_days > 30 ) {
		// Purge the visit data.
		$table_name  = $wpdb->prefix . 'statistics_visit';
		$date_string = $WP_Statistics->current_date( 'Y-m-d', '-' . $purge_days );

		$result = $wpdb->query( $wpdb->prepare( "DELETE FROM {$table_name} WHERE `last_counter` < %s", $date_string ) );

		if ( $result ) {
			// Update the historical count with what we purged.
			$historical_result = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}statistics_historical SET value = value + %d WHERE `category` = 'visits'", $result ) );
			if ( $historical_result == 0 ) {
				$wpdb->insert(
					$wpdb->prefix . "statistics_historical",
					array(
						'value'    => $result,
						'category' => 'visits',
						'page_id'  => - 2,
						'uri'      => '-2',
					)
				);
			}

			$result_string = sprintf( __( '%s data older than %s days purged successfully.', 'wp-statistics' ), '<code>' . $table_name . '</code>', '<code>' . $purge_days . '</code>' );
		} else {
			$result_string = sprintf( __( 'No records found to purge from %s!', 'wp-statistics' ), '<code>' . $table_name . '</code>' );
		}

		// Purge the visitors data.
		$table_name = $wpdb->prefix . 'statistics_visitor';

		$result = $wpdb->query( $wpdb->prepare( "DELETE FROM {$table_name} WHERE `last_counter` < %s", $date_string ) );

		if ( $result ) {
			// Update the historical count with what we purged.
			$historical_result = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}statistics_historical SET value = value + %d WHERE `category` = 'visitors'", $result ) );
			if ( $historical_result == 0 ) {
				$wpdb->insert(
					$wpdb->prefix . "statistics_historical",
					array(
						'value'    => $result,
						'category' => 'visitors',
						'page_id'  => - 1,
						'uri'      => '-1',
					)
				);
			}

			$result_string .= '<br>' . sprintf( __( '%s data older than %s days purged successfully.', 'wp-statistics' ), '<code>' . $table_name . '</code>', '<code>' . $purge_days . '</code>' );
		} else {
			$result_string .= '<br>' . sprintf( __( 'No records found to purge from %s!', 'wp-statistics' ), '<code>' . $table_name . '</code>' );
		}

		// Purge the exclusions data.
		$table_name = $wpdb->prefix . 'statistics_exclusions';

		$result = $wpdb->query( $wpdb->prepare( "DELETE FROM {$table_name} WHERE `date` < %s", $date_string ) );

		if ( $result ) {
			$result_string .= '<br>' . sprintf( __( '%s data older than %s days purged successfully.', 'wp-statistics' ), '<code>' . $table_name . '</code>', '<code>' . $purge_days . '</code>' );
		} else {
			$result_string .= '<br>' . sprintf( __( 'No records found to purge from %s!', 'wp-statistics' ), '<code>' . $table_name . '</code>' );
		}

		// Purge the search data.
		$table_name = $wpdb->prefix . 'statistics_search';
		$result     = $wpdb->query( $wpdb->prepare( "DELETE FROM {$table_name} WHERE `last_counter` < %s", $date_string ) );

		if ( $result ) {
			$result_string .= '<br>' . sprintf( __( '%s data older than %s days purged successfully.', 'wp-statistics' ), '<code>' . $table_name . '</code>', '<code>' . $purge_days . '</code>' );
		} else {
			$result_string .= '<br>' . sprintf( __( 'No records found to purge from %s!', 'wp-statistics' ), '<code>' . $table_name . '</code>' );
		}

		// Purge the pages data, this is more complex as we want to save the historical data per page.
		$table_name = $wpdb->prefix . 'statistics_pages';
		$historical = 0;

		// The first thing we need to do is update the historical data by finding all the unique pages.
		$result = $wpdb->get_results(
			$wpdb->prepare( "SELECT DISTINCT uri FROM {$table_name} WHERE `date` < %s", $date_string )
		);

		// If we have a result, let's store the historical data.
		if ( $result ) {
			// Loop through all the unique rows that were returned.
			foreach ( $result as $row ) {
				// Use the unique rows to get a total count from the database of all the data from the given URIs/Pageids that we're going to delete later.
				$historical = $wpdb->get_var(
					$wpdb->prepare(
						"SELECT sum(count) FROM {$table_name} WHERE `uri` = %s AND `date` < %s",
						$row->uri,
						$date_string
					)
				);

				// Do an update of the historical data.
				$uresult = $wpdb->query(
					$wpdb->prepare(
						"UPDATE {$wpdb->prefix}statistics_historical SET `value` = value + %d WHERE `uri` = %s AND `category` = 'uri'",
						$historical,
						$row->uri,
						$date_string
					)
				);

				// If we failed it's because this is the first time we've seen this URI/pageid so let's create a historical row for it.
				if ( $uresult == 0 ) {
					$wpdb->insert(
						$wpdb->prefix . "statistics_historical",
						array(
							'value'    => $historical,
							'category' => 'uri',
							'uri'      => $row->uri,
							'page_id'  => wp_statistics_uri_to_id( $row->uri ),
						)
					);
				}
			}
		}

		// Now that we've done all of the required historical data storage, we can actually delete the data from the database.
		$result = $wpdb->query( $wpdb->prepare( "DELETE FROM {$table_name} WHERE `date` < %s", $date_string ) );

		if ( $result ) {
			$result_string .= '<br>' . sprintf( __( '%s data older than %s days purged successfully.', 'wp-statistics' ), '<code>' . $table_name . '</code>', '<code>' . $purge_days . '</code>' );
		} else {
			$result_string .= '<br>' . sprintf( __( 'No records found to purge from %s!', 'wp-statistics' ), '<code>' . $table_name . '</code>' );
		}

		if ( $WP_Statistics->get_option( 'prune_report' ) == true ) {
			$blogname  = get_bloginfo( 'name' );
			$blogemail = get_bloginfo( 'admin_email' );

			$headers[] = "From: $blogname <$blogemail>";
			$headers[] = "MIME-Version: 1.0";
			$headers[] = "Content-type: text/html; charset=utf-8";

			if ( $WP_Statistics->get_option( 'email_list' ) == '' ) {
				$WP_Statistics->update_option( 'email_list', $blogemail );
			}

			wp_mail( $WP_Statistics->get_option( 'email_list' ), __( 'Database pruned on', 'wp-statistics' ) . ' ' . $blogname, $result_string, $headers );
		}

		return $result_string;
	} else {
		return __( 'Please select a value over 30 days.', 'wp-statistics' );
	}
}
