<?php
class Entries_CSV {
	public function __construct () {
		add_action( 'init', array( $this, 'init' ) );
		add_action( 'query_vars', array( $this, 'filter_query_vars' ) );
		add_action( 'template_redirect', array( $this, 'template_redirect' ) );
	}

	public function init () {
		add_rewrite_rule(
			'downloads/(\d+)/entries.csv/?$',
			'index.php?pagename=entries_download&survey_id=$matches[1]',
			'top'
		);
	}

	public function filter_query_vars ( $query_vars ) {
		$query_vars[] = 'survey_id';
		return  $query_vars;
	}

	public function template_redirect () {
		$pagename = get_query_var('pagename');
		if ( $pagename !== 'entries_download' ) return;
		$this->template();
		exit();
	}

	private function template () {
		$survey_id = get_query_var('survey_id');
		if ( empty( $survey_id ) ) return;

		global $wpdb;
		$survey = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}bwsurvey_surveys WHERE id = %d", $survey_id));
		$survey_data = unserialize($survey->data);

		$csv = array();
		$fields = array();
		$row = array(
			'Date',
			'Status'
		);
		foreach ($survey_data['sections'] as $section) {
			foreach ($section as $field_id) {
				$fields[] = $field_id;
				$row[] = $survey_data['fields'][$field_id]['label'];
			}
		}
		$csv[] = $row;

		$per_page = 500;

		$item_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(id) FROM {$wpdb->prefix}bwsurvey_entries WHERE LENGTH(data) > 6 AND survey_id = %d;", $survey_id));
		$page_count = ceil($item_count / $per_page);

		$page = isset($_GET['page']) ? max(1, $_GET['page']) : 1;

		header( 'Content-type: text/csv', true, 200 );
		header( "Content-Disposition: attachment; filename=entries_page_{$page}_of_{$page_count}.csv" );
		header( 'Pragma: no-cache' );
		header( 'Expires: 0' );

		$entries = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}bwsurvey_entries
			WHERE LENGTH(data) > 6 AND survey_id = %d
			ORDER BY created_on ASC
			LIMIT %d OFFSET %d",
			$survey_id,
			$per_page,
			$per_page * ($page - 1)
		));

		foreach ( $entries as $entry ) {
			$entry_data = unserialize($entry->data);
			$row = array(
				'"' . addslashes( date( 'F jS, Y, g:i:s A', strtotime( $entry->created_on ) ) ) . '"',
				$entry->submitted ? 'Submitted' : 'Not Submitted'
			);
			foreach ($fields as $field_id) {
				$row[] = isset( $entry_data[$field_id] ) ? '"' . addslashes( $entry_data[$field_id] ) . '"' : '';
			}
			$csv[] = $row;
		}
		echo implode( "\n", array_map( function ($row) {
			return implode( ',', $row );
		}, $csv ) );
	}
}
