/**
  * Returns the following arrays:
  *
  * 1. $scenarios             - contains all scenario ids.
  * 2. $scenario_settings     - includes scenario actions and masked components in scenarios.
  * 3. $scenario_data         - maps every product/variation in a group to the scenarios where it is active.
  * 4. $defaults_in_scenarios - the scenarios where all default component selections coexist.
  *
  * @param  array $bto_scenario_meta     scenarios meta
  * @param  array $bto_data              component data - values may contain a 'current_component_options' key to generate scenarios for a subset of all component options
  * @return array
  */
 public static function build_scenarios($bto_scenario_meta, $bto_data)
 {
     $scenarios = empty($bto_scenario_meta) ? array() : array_map('strval', array_keys($bto_scenario_meta));
     $common_scenarios = $scenarios;
     $scenario_data = array();
     $scenario_settings = array();
     $compat_group_count = 0;
     // Store the 'actions' associated with every scenario.
     foreach ($scenarios as $scenario_id) {
         $scenario_settings['scenario_actions'][$scenario_id] = array();
         if (isset($bto_scenario_meta[$scenario_id]['scenario_actions'])) {
             $actions = array();
             foreach ($bto_scenario_meta[$scenario_id]['scenario_actions'] as $action_name => $action_data) {
                 if (isset($action_data['is_active']) && $action_data['is_active'] === 'yes') {
                     $actions[] = $action_name;
                     if ($action_name === 'compat_group') {
                         $compat_group_count++;
                     }
                 }
             }
             $scenario_settings['scenario_actions'][$scenario_id] = $actions;
         } else {
             $scenario_settings['scenario_actions'][$scenario_id] = array('compat_group');
             $compat_group_count++;
         }
     }
     $scenario_settings['scenario_actions']['0'] = array('compat_group');
     // Find which components in every scenario are 'non shaping components' (marked as unrelated).
     if (!empty($bto_scenario_meta)) {
         foreach ($bto_scenario_meta as $scenario_id => $scenario_single_meta) {
             $scenario_settings['masked_components'][$scenario_id] = array();
             foreach ($bto_data as $group_id => $group_data) {
                 if (isset($scenario_single_meta['modifier'][$group_id]) && $scenario_single_meta['modifier'][$group_id] === 'masked') {
                     $scenario_settings['masked_components'][$scenario_id][] = (string) $group_id;
                 }
             }
         }
     }
     $scenario_settings['masked_components']['0'] = array();
     // Include the '0' scenario for use when no 'compat_group' scenarios exist.
     if ($compat_group_count === 0) {
         $scenarios[] = '0';
     }
     // Map each product and variation to the scenarios that contain it.
     foreach ($bto_data as $group_id => $group_data) {
         $scenario_data[$group_id] = array();
         // 'None' option.
         if ($group_data['optional'] === 'yes') {
             $scenarios_for_product = self::get_scenarios_for_product($bto_scenario_meta, $group_id, -1, '', 'none');
             $scenario_data[$group_id][0] = $scenarios_for_product;
         }
         // Component options.
         // When indicated, build scenarios only based on a limited set of component options.
         if (isset($bto_data[$group_id]['current_component_options'])) {
             $component_options = $bto_data[$group_id]['current_component_options'];
             // Otherwise run a query to get all component options.
         } else {
             $component_options = WC_CP()->api->get_component_options($group_data);
         }
         foreach ($component_options as $product_id) {
             if (!is_numeric($product_id)) {
                 continue;
             }
             // Get product type.
             $terms = get_the_terms($product_id, 'product_type');
             $product_type = !empty($terms) && isset(current($terms)->name) ? sanitize_title(current($terms)->name) : 'simple';
             if ($product_type === 'variable') {
                 $variations = WC_CP_Helpers::get_product_variations($product_id);
                 if (!empty($variations)) {
                     $scenarios_for_product = array();
                     foreach ($variations as $variation_id) {
                         $scenarios_for_variation = self::get_scenarios_for_product($bto_scenario_meta, $group_id, $product_id, $variation_id, 'variation');
                         $scenarios_for_product = array_merge($scenarios_for_product, $scenarios_for_variation);
                         $scenario_data[$group_id][$variation_id] = $scenarios_for_variation;
                     }
                     $scenario_data[$group_id][$product_id] = array_values(array_unique($scenarios_for_product));
                 }
             } else {
                 $scenarios_for_product = self::get_scenarios_for_product($bto_scenario_meta, $group_id, $product_id, '', $product_type);
                 $scenario_data[$group_id][$product_id] = $scenarios_for_product;
             }
         }
         if (isset($group_data['default_id']) && $group_data['default_id'] !== '') {
             if (!empty($scenario_data[$group_id][$group_data['default_id']])) {
                 $common_scenarios = array_intersect($common_scenarios, $scenario_data[$group_id][$group_data['default_id']]);
             } else {
                 $common_scenarios = array();
             }
         }
     }
     return array('scenarios' => $scenarios, 'scenario_settings' => $scenario_settings, 'scenario_data' => $scenario_data, 'defaults_in_scenarios' => $common_scenarios);
 }
 /**
  * @deprecated 3.5.0
  */
 public function get_product_variations($item_id)
 {
     _deprecated_function('WC_CP_API::get_product_variations()', '3.5.0', 'WC_CP_Helpers::get_product_variations()');
     return WC_CP_Helpers::get_product_variations($item_id);
 }