<?php

class Wiaas_Admin_Order_Process_Flow {

	public static function init() {

		add_action( 'gravityflow_entry_detail', array( __CLASS__, 'display_process_steps_details' ), 10, 3 );

		//add_action( 'gravityflow_title_entry_detail', array( __CLASS__, 'process_title' ), 10, 3 );

		add_action('gravityflow_entry_detail', array(__CLASS__, 'add_delivery_dates_box'), 9, 3);

		add_action('gravityflow_entry_detail', array(__CLASS__, 'maybe_display_delivery_process_navigation'), 9, 3);

		add_action('gravityflow_workflow_detail_sidebar', array(__CLASS__, 'render_procurement_order_download_link'), 10, 3);

		add_filter('gravityflow_admin_action_feedback', array(__CLASS__, 'maybe_process_admin_step_change_action'), 10, 4);

		add_filter('gravityflow_admin_actions_workflow_detail', array(__CLASS__, 'filter_workflow_admin_actions'), 10, 5);
	}

	/**
     * Filter workflow admin actions
     *
	 * @param $admin_actions
	 * @param $current_step
	 * @param $steps
	 * @param $form
	 * @param $entry
	 *
	 * @return array
	 */
	public static function filter_workflow_admin_actions($admin_actions, $current_step, $steps, $form, $entry) {

	    $allowed_actions = array();

	    // allow basic admin actions for step action workflow
	    if (Wiaas_Delivery_Process_Action::is_action_form($form)) {

		    $allowed_actions = array( 'cancel_workflow', 'restart_workflow', 'restart_step');
        }

        $filtered_admin_actions = array();

		foreach ( $admin_actions as $admin_action ) {

		    if (in_array($admin_action['value'], $allowed_actions)) {
		        $filtered_admin_actions[] = $admin_action;
            }
	    }

	    return $filtered_admin_actions;
    }

	public static function render_procurement_order_download_link($form, $entry, $current_step) {

		if(! GFAPI::current_user_can_any( 'gravityflow_workflow_detail_admin_actions' ) ||
		   empty( $current_step ) ||
		   Wiaas_Delivery_Process_Action::is_action_form($form) )  {
			return;
		}

		$order_id = $entry['wiaas_delivery_order_id'];

		?>

		<div class="postbox">
			<h3 class="hndle">
				<?php esc_html_e('Procurement report', 'wiaas') ?>
			</h3>
			<div style="padding: 10px;">
				<a
					id="wiaas_download_procurement_order_btn"
					href="<?php echo admin_url() . '?wiaas-procurement-order-id=' . $order_id ?>"
					download
					class="button"
				>
					<span><?php esc_html_e('Download procurement report', 'wiaas') ?></span>
				</a>
			</div>
		</div>
		<?php

	}

	public static function add_delivery_dates_box($form, $entry, $current_step) {

		if(! GFAPI::current_user_can_any( 'gravityflow_workflow_detail_admin_actions' ) ||
		   empty( $current_step ) || Wiaas_Delivery_Process_Action::is_action_form($form) )  {
			return;
		}

		$workflow_api = new Gravity_Flow_API($form['id']);
		$steps = $workflow_api->get_steps();

		/**
		 * Disable if:
		 *  - actions for customer config validation is not done
		 * - action for customer acceptance is active or completed
		 */
		$is_disabled = false;
		foreach ($steps as $step) {

			if (Wiaas_Delivery_Process_Action::process_step_has_customer_validate_questionnaires_action($step) &&
			    $step->get_status() !== 'complete') {

				$is_disabled = true;
				break;
			}

			if (Wiaas_Delivery_Process_Action::process_step_has_customer_acceptance_action($step) &&
			    ($step->get_id() === $current_step->get_id() || $step->get_status() === 'complete')) {

				$is_disabled = true;
				break;
			}
		}

		$order_id = $entry['wiaas_delivery_order_id'];

		$suppliers = Wiaas_Order::get_suppliers($order_id);
		$final_estimated_date = Wiaas_Order::get_final_estimated_date($order_id);
		$final_confirmed_date = Wiaas_Order::get_final_confirmed_date($order_id);
		$earliest_installation_date = Wiaas_Order::get_earliest_installation_date($order_id);

		require 'views/html-order-suppliers-delivery-dates.php';
	}

	public static function maybe_process_admin_step_change_action($feedback, $admin_action, $form, $entry) {

		$admin_action = rgpost( 'wiaas_delivery_process_navigation_action' );

		if ($admin_action === 'complete') {

			$api = new Gravity_Flow_API( $form['id'] );

			$current_step = $api->get_current_step($entry);

			if ( $current_step ) {
				$current_step->purge_assignees();
				$current_step->update_step_status( 'complete' );
			}

			$api->process_workflow($entry['id']);

			$feedback = esc_html__( 'Workflow Complete',  'wiaas' );

			return $feedback;
        }

		list( $base_admin_action, $action_id ) = rgexplode( '|', $admin_action, 2 );

		if ( $base_admin_action == 'send_to_step' ) {
			$step_id = $action_id;
			$api = new Gravity_Flow_API( $form['id'] );
			$api->send_to_step( $entry, $step_id );
			$entry = GFAPI::get_entry( $entry['id'] );
			$new_step = $api->get_current_step( $entry );
			$feedback = $new_step ?
				sprintf( esc_html__( 'Sent to step: %s',  'wiaas' ), $new_step->get_name() ) :
				esc_html__( 'Workflow Complete',  'wiaas' );
		}

		return $feedback;
	}

	public static function maybe_display_delivery_process_navigation($form, $entry, $current_step) {

		if(! GFAPI::current_user_can_any( 'gravityflow_workflow_detail_admin_actions' ) ||
		   empty( $current_step ) ||
		   Wiaas_Delivery_Process_Action::is_action_form($form) )  {
			return;
		}

		$steps = gravity_flow()->get_steps($form['id'], $entry);

		// get next step id
		$next_step = gravity_flow()->get_next_step($current_step, $entry, $form);
		$next_step_id = empty($next_step) ? null : $next_step->get_id();

		// get previous step id
		foreach ($steps as $step) {

			$next = gravity_flow()->get_next_step($step, $entry, $form);
			if ($next && $next->get_id() === $current_step->get_id()) {
				$previous_step = $step;
			}
		}
		$previous_step_id = empty($previous_step) ? null : $previous_step->get_id();

		// bail out if none exist
		if ( empty($next_step_id) && empty($previous_step_id) ) {

			return;
		}

		/**
		 * @reference Gravity_Flow::maybe_process_admin_action for used field names
		 *            which are being checked there
		 *
		 */

		?>

		<div style="padding:10px; height:40px">

			<input id="wiaas_delivery_process_navigation_action" type="hidden" name="wiaas_delivery_process_navigation_action">
			<input type="hidden" name="_gravityflow_admin_action" value="1">

			<input
				data-step="<?php echo empty($next_step_id) ? 'complete' : 'send_to_step|'.$next_step_id ?>"
				type="submit"
				class="button button-primary wiaas_delivery_step_nav"
				style="float:right; margin-left: 20px;"
                value="<?php echo empty($next_step_id) ? 'COMPLETE' : 'NEXT STEP' ?>"
            >

			<input
				data-step="send_to_step|<?php esc_attr_e($previous_step_id, 'wiaas') ?>"
				type="submit"
				<?php disabled(empty($previous_step_id), true, true) ?>
				class="button button-primary wiaas_delivery_step_nav"
				style="float:right;" value="PREV STEP">
		</div>
		<?php
	}

	public static function display_process_steps_details($form, $entry, $current_step) {

		$delivery_settings = rgar($form, 'wiaas_delivery_process');

		if ($delivery_settings['delivery_form_type'] === 'action') {
			return;
		}

		// get process order ID
		$order_id = absint($entry['wiaas_delivery_order_id']);

		if (empty($order_id)) {

			$order_field = GFCommon::get_fields_by_type($form, array( 'wiaas_order') )[0];

			if ( ! empty($order_field)) {

				$order_id = $entry[$order_field->id];
			}
		}

		// display process steps

		$workflow_api = new Gravity_Flow_API($form['id']);

		$steps = $workflow_api->get_steps();

		?>

		<div class="postbox">
			<h3>
				<i class="fa fa-circle" style="font-size: 22px; margin-right: 10px;color: #34C388; "></i>
				<span>Order placed </span>
			</h3>
		</div>

		<div class="postbox">
			<h3>
				<i class="fa fa-circle" style="font-size: 22px; margin-right: 10px;color: #34C388; "></i>
				<span> Assign process </span>
			</h3>
		</div>

		<?php

		foreach ($steps as $index => $step) {

			if (! $step->is_active()) {
				continue;
			}

			$is_step_completed = $step->get_status() === 'complete' || $step->get_status() === 'approved';
			$is_current_step = $current_step && $step->get_id() === $current_step->get_id();

			if ($is_current_step) {
				$style = 'color: #FD8049;';
			} else if ($is_step_completed) {
				$style = 'color: #34C388;';
			} else {
				$style = 'opacity: 0.5; color: #CCC;';
			}

			?>

			<div class="postbox">

				<h3>
					<i class="fa fa-circle" style="font-size: 22px; margin-right: 10px; <?php esc_attr_e($style, 'wiaas') ?>"></i>
					<span><?php esc_html_e($step->get_name(), 'wiaas') ?></span>
				</h3>

				<?php
				Gravity_Flow_Entry_Detail::maybe_show_instructions(true, true, $current_step, $form, $entry);

				$action_form = GFAPI::get_form( $step->target_form_id );

				if (empty($action_form)) {

					echo '</div>';

					continue;
				}

				$page_size       = 20;
				$search_criteria = array(
					'status'        => 'active',
					'field_filters' => array(
						array( 'key'   => 'wiaas_delivery_process_id',
						       'value' => $entry['id']
						),
					),
				);
				$sorting         = array( 'key' => 'date_created', 'direction' => 'DESC' );
				$paging          = array( 'offset' => 0, 'page_size' => $page_size );

				$entries = GFAPI::get_entries( $action_form['id'], $search_criteria, $sorting, $paging );

				if (empty($entries)) {

				    echo '</div>';

					continue;
                }

				?>

                <div class="submitbox" style="padding: 10px;">

                    <table>
                        <tbody>
						<?php
						echo '<br><br><br>';


						foreach ($entries as $action_entry) {
							self::_display_step_action_entry($action_form, $action_entry);
						}

						?>
                        </tbody>
                    </table>



                </div>

				<?php
				?>

			</div>
			<?php
		}
	}

	private static function _display_step_action_entry($action_form, $action_entry) {
		$workflow_api = new Gravity_Flow_API($action_entry['form_id']);

		$current_action_step = $workflow_api->get_current_step($action_entry);

		$entry_url = add_query_arg( array(
			'page' => 'gravityflow-inbox',
			'view' => 'entry',
			'id' => $action_entry['form_id'],
			'lid' => $action_entry['id']
		), admin_url() );


		?>
		<table>

			<?php
			foreach ($action_form['fields'] as $field) {

				if ($field->type === 'wiaas_order') {
					continue;
				}

				if ($field->type === 'workflow_discussion') {

					echo '<tr style="padding: 20px;"><td colspan="2">' . $field->format_discussion_value($action_entry[$field->id]) . '</td></tr>';

					continue;
				}

				$value = $field->get_value_entry_detail($action_entry[$field->id]);
				$label = $field->get_field_label(false, $action_entry[$field->id]);

				echo '<tr>' .
				     '<td><strong>' . $label . ' : </strong></td>' .
				     '<td>' . $value . '</td>' .
				     '</tr>';
			}

			?>

			<tfoot>
			<tr>
				<td colspan="2" style="text-transform: uppercase;font-size: 11px; letter-spacing: 0.4px; margin:10px;">
					<strong>

						<?php

						echo empty($current_action_step) ?
                            $workflow_api->get_status($action_entry) :
							$current_action_step->get_status_label($current_action_step->get_status()) . ': ' . $current_action_step->get_name();;

						echo '<a target="_blank" href="' . $entry_url  . '">' .
						     ' <i class="fa fa-external-link" style="font-size: 16px;"></i>' .
						     '</a>';

						?>

					</strong>
				</td>
			</tr>
			</tfoot>

			<?php


			?>
		</table>

		<hr />
		<?php
	}

}

Wiaas_Admin_Order_Process_Flow::init();
