<?php
/**
 * @wordpress-plugin
 * Plugin Name:       Job & Resume Submit Steps Indicator for WC Paid Listings and WP Job Manager
 * Plugin URI:        https://codecanyon.net/user/themico/portfolio
 * Description:       Plugin that combines WP Job Manager and it's addons dasboards with WooCommerce My account.
 * Version:           1.3
 * Author:            Hleb Paltanovich
 * Author URI:        https://codecanyon.net/user/themico
 * License:           GPL-2.0+
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Text Domain:       stepper-wpjm
 * Domain Path:       /languages
 */

/**
 * Add stepper.
 */ 
add_filter( 'the_content', 'stepper_wpjm' );

/**
 * Load plugin textdomain.
 */ 
add_action( 'init', 'stepper_wpjm_plugin_textdomain' );

/**
 * Main stepper sunction.
 * 
 * - Check if stepper belongs to a page
 * - Init steps
 * - Display stepper
 */
function stepper_wpjm( $content ) {

  // No WP Job Manager or WC Paid Listings plugins installed?
  if( ! class_exists( 'WC_Paid_Listings' ) || ! class_exists( 'WP_Job_Manager' ) ) {
    return $content;
  }

  // Get Job and Resume submission pages
  $job_submit_page_id = get_option( 'job_manager_submit_job_form_page_id' );
  $resume_submit_page_id = get_option( 'resume_manager_submit_resume_form_page_id' );

  // Additional checks to display stepper
  if(
    ! ( ! empty( $job_submit_page_id ) && $job_submit_page_id == get_the_ID() )
    &&
    ! ( ! empty( $resume_submit_page_id ) && $resume_submit_page_id == get_the_ID() )
    &&
    ! is_checkout()
    &&
    ! is_wc_endpoint_url( 'order-received' )
  ) {
    return $content;
  }

  // Now, since the stepper will display, it's time to add a CSS file
  wp_enqueue_style( 'stepper-wp-job-manager', plugin_dir_url( __FILE__ ) . 'front.css' );

  // Find out if any of the packages in a cart / order -
  // we don't want to display stepper for usual WC purchases
  if( is_wc_endpoint_url( 'order-received' ) ) {
    $has_job_package = stepper_wpjm_order_has_package();
    $has_resume_package = stepper_wpjm_order_has_package( 'resume_package' );
  } else {
    $paid_listings = WC_Paid_Listings_Cart::get_instance();
    $has_job_package = $paid_listings->cart_contains_job_package();
    $has_resume_package = $paid_listings->cart_contains_resume_package();  
  }

  if(
    ( $job_submit_page_id == get_the_ID() || ! is_null( $has_job_package ) )
    &&
    ! empty( stepper_wpjm_product_type_exists() )
  ) {
    $steps = stepper_wpjm_job_steps();
  } else if( 
    ( $resume_submit_page_id == get_the_ID() || ! is_null( $has_resume_package ) )
    &&
    ! empty( stepper_wpjm_product_type_exists('resume_package') )
  ) {
    $steps = stepper_wpjm_resume_steps();
  } else {
    return $content;
  }

  $steps = stepper_wpjm_build( $steps );
  $replace_string = apply_filters( 'wpjm_stepper_replace', '' );

  // Display
  if( ! empty($replace_string) && strpos($content, $replace_string) !== false ) {
    return str_replace( $replace_string, $steps, $content );
  }

  return $steps . $content;

}

/**
 * Define job submission steps.
 */ 
function stepper_wpjm_job_steps() {

  $job_steps = array(
    'submit' => array(
      esc_html_x( 'Job Details', 'Job submit', 'stepper-wpjm' ),
      esc_html_x( '5 min', 'Jobs submit description', 'stepper-wpjm' ),
    ),
    'preview' => array(
      esc_html_x( 'Preview', 'Jobs preview', 'stepper-wpjm' ),
      esc_html_x( '30 sec', 'Jobs preview description', 'stepper-wpjm' ),
    ),
    'wc-choose-package' => array(
      esc_html_x( 'Choose Package', 'Job choose package', 'stepper-wpjm' ),
      esc_html_x( '30 sec', 'Job choose package description', 'stepper-wpjm' ),
    ),
    'checkout' => array(
      esc_html_x( 'Checkout', 'Jobs checkout', 'stepper-wpjm' ),
      esc_html_x( '1 min', 'Jobs checkout description', 'stepper-wpjm' ),
    ),
    'confirmation' => array(
      esc_html_x( 'Confirmation', 'Jobs confirmation', 'stepper-wpjm' ),
      esc_html_x( '0 sec', 'Jobs confirmation description', 'stepper-wpjm' ),
    ),
  );

  if( 'before' === get_option( 'job_manager_paid_listings_flow' ) ) {
    $job_steps = array( 'wc-choose-package' => $job_steps['wc-choose-package'] ) + $job_steps;
  }

  return apply_filters( 'stepper_wpjm_job_steps', $job_steps );
}

/**
 * Define resume submission steps.
 */ 
function stepper_wpjm_resume_steps() {

  $resume_steps = array(
    'submit' => array(
      esc_html_x( 'Resume Details', 'Resume submit', 'stepper-wpjm' ),
      esc_html_x( '3-10 min', 'Resumes submit description', 'stepper-wpjm' ),
    ),
    'preview' => array(
      esc_html_x( 'Preview', 'Resume preview', 'stepper-wpjm' ),
      esc_html_x( '30 sec', 'Resume preview description', 'stepper-wpjm' ),
    ),
    'wc-choose-package' => array(
      esc_html_x( 'Choose Package', 'Resume choose package', 'stepper-wpjm' ),
      esc_html_x( '30 sec', 'Resumes choose package description', 'stepper-wpjm' ),
    ),
    'checkout' => array(
      esc_html_x( 'Checkout', 'Resume checkout', 'stepper-wpjm' ),
      esc_html_x( '~3 min', 'Resume checkout description', 'stepper-wpjm' ),
    ),
    'confirmation' => array(
      esc_html_x( 'Confirmation', 'Resume confirmation', 'stepper-wpjm' ),
      esc_html_x( '0 sec', 'Resume confirmation description', 'stepper-wpjm' ),
    ),
  );

  if( 'before' === get_option( 'resume_manager_paid_listings_flow' ) ) {
    $resume_steps = array( 'wc-choose-package' => $resume_steps['wc-choose-package'] ) + $resume_steps;
  }

  return apply_filters( 'stepper_wpjm_resume_steps', $resume_steps );
}

/**
 * Stepper markup.
 */ 
function stepper_wpjm_build( $steps ) {

  if( empty( $steps ) ) {
    return;
  }

  $active_step = '';

  // If on the WP Job Manager submission process part
  // (next goes WooCommerce checkout part)
  if ( class_exists( 'WP_Job_Manager_Form_Submit_Job' ) ) {
    $form = WP_Job_Manager_Form_Submit_Job::instance();
    $step = $form->get_step_key();
  } else if ( class_exists( 'WP_Resume_Manager_Form_Submit_Resume' ) ) {
    $form = WP_Resume_Manager_Form_Submit_Resume::instance();
    $step = $form->get_step_key();
  } /*else {
    echo '1111';
    return;
  }*/

  if( isset( $step ) ) {
    $active_step = " active-step-{$step}";
  } else if( isset( $_GET['step'] ) && isset( $_GET['resume_id'] ) ) {
    // Exclusion step for Resume packages step whihc is not indicated
    $active_step = " active-step-wc-choose-package";
  }

  $stepper = "<ol class=\"c-stepper{$active_step}\">";
    foreach( $steps as $key => $step ) {
      $stepper .= "<li class=\"c-stepper__item step-{$key}\"><div class=\"c-stepper__content\"><h3 class=\"c-stepper__title\">{$step[0]}</h3><p class=\"c-stepper__desc\">{$step[1]}</p></div></li>";
    }
  $stepper .= "</ol>";

  return $stepper;
}

/**
 * Check if order has job or resume package.
 */
function stepper_wpjm_order_has_package( $listing_type = 'job_package' ) {
  $order_id = wc_get_order_id_by_order_key( $_GET['key'] );
  $order = wc_get_order( $order_id );
  foreach( $order->get_items( 'line_item' ) as $item ) {
    $product = $item->get_product();
    if ( $product instanceof WC_Product && $product->is_type( $listing_type ) ) {
      return true;
    }
  }
  return null;
}

/**
 * Check if job/resumes package type products exists.
 */
function stepper_wpjm_product_type_exists( $product_type = 'job_package' ) {
  return wc_get_products( array(
    'type'   => $product_type,
    'status' => 'publish',
    'limit'  => 1,
    'return' => 'ids'
  ) );
}

/**
 * Load plugin textdomain.
 */
function stepper_wpjm_plugin_textdomain() {
  load_plugin_textdomain(
    'stepper-wpjm',
    false,
    dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
  );
}