<?php
/**
 * Notes Functions
 *
 * @package     EDD
 * @subpackage  Admin/Discounts
 * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 * @since       3.0
 */

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore

/**
 * Get the HTML used to output all of the notes for a single object
 *
 * @since 3.0
 *
 * @param array $notes
 * @return string
 */
function edd_admin_get_notes_html( $notes = array() ) {

	// Whether to show or hide the "No notes" default text
	$no_notes_display = ! empty( $notes )
		? ' style="display:none;"'
		: '';

	// Start a buffer
	ob_start(); ?>

	<div id="edd-notes" class="edd-notes">
		<?php

		// Output notes
		foreach ( $notes as $note ) {
			echo edd_admin_get_note_html( $note );
		}

		?>

		<p class="edd-no-notes"<?php echo $no_notes_display; ?>>
			<?php _e( 'No notes.', 'easy-digital-downloads' ); ?>
		</p>
	</div>

	<?php

	// Return the current buffer
	return ob_get_clean();
}

/**
 * Get the HTML used to output a single note, from an array of notes
 *
 * @since 3.0
 * @param int $note_id Note ID.
 *
 * @return string
 */
function edd_admin_get_note_html( $note_id = 0 ) {

	// Get the note.
	$note = is_numeric( $note_id )
		? edd_get_note( $note_id )
		: $note_id;

	// No note, so bail.
	if ( empty( $note ) ) {
		return;
	}

	// User.
	$user_id = $note->user_id;
	$author  = edd_get_bot_name();
	if ( ! empty( $user_id ) ) {
		/* translators: user ID */
		$author      = sprintf( __( 'User ID #%s', 'easy-digital-downloads' ), $user_id );
		$user_object = get_userdata( $user_id );
		if ( $user_object ) {
			$author = ! empty( $user_object->display_name ) ? $user_object->display_name : $user_object->user_login;
		}
	}

	// Note type badge.
	$type_badge = '';
	if ( edd_is_admin_page( 'customers' ) ) {
		if ( 'order' === $note->object_type ) {
			$badge      = new EDD\Utils\StatusBadge(
				array(
					'status'   => 'order',
					'label'    => sprintf(
						/* translators: %d: order ID */
						__( 'Order #%d', 'easy-digital-downloads' ),
						absint( $note->object_id )
					),
					'color'    => 'blue',
					'icon'     => 'cart',
					'position' => 'before',
				)
			);
			$order_url  = edd_get_admin_url(
				array(
					'page' => 'edd-payment-history',
					'view' => 'view-order-details',
					'id'   => absint( $note->object_id ),
				)
			);
			$type_badge = sprintf( '<a href="%s">%s</a>', esc_url( $order_url ), $badge->get() );
		} elseif ( 'customer' === $note->object_type ) {
			$badge      = new EDD\Utils\StatusBadge(
				array(
					'status' => 'customer',
					'label'  => __( 'Customer', 'easy-digital-downloads' ),
					'color'  => 'default',
				)
			);
			$type_badge = $badge->get();
		}
	}

	// URL to delete note.
	$delete_note_url = wp_nonce_url(
		add_query_arg(
			array(
				'edd-action' => 'delete_note',
				'note_id'    => absint( $note->id ),
			)
		),
		'edd_delete_note_' . absint( $note->id )
	);

	// Start a buffer.
	ob_start();
	?>

	<div class="edd-note" id="edd-note-<?php echo esc_attr( $note->id ); ?>">
		<div class="edd-note__header">
			<?php echo $type_badge; ?>
			<strong class="edd-note-author"><?php echo esc_html( $author ); ?></strong>
			<time datetime="<?php echo esc_attr( EDD()->utils->date( $note->date_created, null, true )->toDateTimeString() ); ?>"><?php echo edd_date_i18n( $note->date_created, 'datetime' ); ?></time>
			<a href="<?php echo esc_url( $delete_note_url ); ?>#edd-notes" class="edd-delete-note" data-note-id="<?php echo esc_attr( $note->id ); ?>" data-object-id="<?php echo esc_attr( $note->object_id ); ?>" data-object-type="<?php echo esc_attr( $note->object_type ); ?>">
				<?php echo esc_html_x( '&times;', 'Delete note', 'easy-digital-downloads' ); ?>
			</a>
		</div>

		<?php echo wpautop( make_clickable( $note->content ) ); ?>
	</div>

	<?php

	// Return the current buffer
	return ob_get_clean();
}

/**
 * Get the HTML used to add a note to an object ID and type
 *
 * @since 3.0
 *
 * @param int    $object_id
 * @param string $object_type
 *
 * @return string
 */
function edd_admin_get_new_note_form( $object_id = 0, $object_type = '' ) {

	if ( ! current_user_can( 'edit_shop_payments' ) ) {
		return '';
	}

	// Start a buffer
	ob_start();
	?>

	<div class="edd-add-note">
		<div class="edd-form-group">
			<label class="edd-form-group__label screen-reader-text" for="edd-note">
				<?php esc_html_e( 'Note', 'easy-digital-downloads' ); ?>
			</label>

			<div id="edd-form-group__control">
				<textarea name="edd-note" id="edd-note" class="edd-form-group__input"></textarea>
			</div>
		</div>

		<div class="edd-form-group">
			<button type="button" id="edd-add-note" class="edd-note-submit button button-secondary left" data-object-id="<?php echo esc_attr( $object_id ); ?>" data-object-type="<?php echo esc_attr( $object_type ); ?>">
				<?php _e( 'Add Note', 'easy-digital-downloads' ); ?>
			</button>
			<span class="spinner"></span>
		</div>

		<?php wp_nonce_field( 'edd_note', 'edd_note_nonce' ); ?>
	</div>

	<?php

	// Return the current buffer
	return ob_get_clean();
}

/**
 * Return the URL to redirect to after deleting a note
 *
 * For now, this is always the current URL, because we aren't ever sure where
 * notes are being used. Maybe this will need a filter or something, someday.
 *
 * @since 3.0
 *
 * @return string
 */
function edd_get_note_delete_redirect_url() {

	// HTTP or HTTPS
	$scheme = is_ssl()
		? 'https'
		: 'http';

	// Return the concatenated URL
	return "{$scheme}://{$_SERVER[HTTP_HOST]}{$_SERVER[REQUEST_URI]}";
}

/**
 * Return the HTML used to paginate through notes.
 *
 * @since 3.0
 * @param array $args
 */
function edd_admin_get_notes_pagination( $args = array() ) {

	// Parse args
	$r = wp_parse_args(
		$args,
		array(
			'total'        => 0,
			'pag_arg'      => 'paged',
			'base'         => '%_%',
			'show_all'     => true,
			'prev_text'    => is_rtl() ? '&rarr;' : '&larr;',
			'next_text'    => is_rtl() ? '&larr;' : '&rarr;',
			'add_fragment' => '',
		)
	);

	// Maximum notes per page
	$per_page    = apply_filters( 'edd_notes_per_page', 20 );
	$r['total']  = ceil( $r['total'] / $per_page );
	$r['format'] = "?{$r['pag_arg']}=%#%";

	// Don't allow pagination beyond the boundaries
	$r['current'] = ! empty( $_GET[ $r['pag_arg'] ] ) && is_numeric( $_GET[ $r['pag_arg'] ] )
		? absint( $_GET[ $r['pag_arg'] ] )
		: 1;

	// Start a buffer
	ob_start();
	?>

	<div class="edd-note-pagination">
		<?php echo paginate_links( $r ); ?>
	</div>

	<?php

	// Return the current buffer
	return ob_get_clean();
}
