/**
  * Build the product structure with variation for product choosed by the user into frontend sheet
  *
  * @param array $selected_variation THe list of variation choosed by the user in product frontend sheet
  * @param integer $product_id The basic product choose by the user in frontend
  *
  * @return array The product list for adding to the cart build by variation priority
  */
 public static function get_variation_by_priority($selected_variation, $product_id, $add_to_cart_action = false)
 {
     global $wpdb;
     $all_required_variations_selected = $no_selected_variation = true;
     $single_variations = $combined_variations = $product_to_add_to_cart = array();
     // Check if all required variations are selected
     $required_attributes_list = wpshop_prices::check_required_attributes($product_id);
     foreach ($selected_variation as $k => $value) {
         if ($value == 0 && in_array($k, $required_attributes_list)) {
             $all_required_variations_selected = false;
         }
         if ($value != 0) {
             $no_selected_variation = false;
         }
     }
     if (!empty($selected_variation)) {
         //Check variations configuration
         $product_variation_configuration = get_post_meta($product_id, '_wpshop_variation_defining', true);
         // Check variations type
         $product_variation_type = !empty($product_variation_configuration) && !empty($product_variation_configuration['variation_type']) ? $product_variation_configuration['variation_type'] : 'single';
         $product_to_add_to_cart[$product_id]['variation_priority'] = $product_variation_type;
         //Check defined variation priority
         $priority = !empty($product_variation_configuration['options']) && !empty($product_variation_configuration['options']['priority'][0]) ? $product_variation_configuration['options']['priority'][0] : 'combined';
         $product_to_add_to_cart[$product_id]['defined_variation_priority'] = $priority;
         // Recover all product variations
         $query_variation = $selected_variation;
         // Delete free variations
         unset($query_variation['free']);
         if ($product_variation_type == 'single') {
             // Get single variations
             $single_variations = array();
             foreach ($selected_variation as $attribute_code => $attribute_value) {
                 if (isset($attribute_value) && $attribute_code != 'free') {
                     $query = $wpdb->prepare("SELECT ID FROM " . $wpdb->postmeta . " AS P_META INNER JOIN " . $wpdb->posts . " as P ON ((P.ID = P_META.post_id) AND (P.post_parent = %d)) WHERE P_META.meta_value = '" . serialize(array($attribute_code => $attribute_value)) . "'", $product_id);
                     $single_variation_id = $wpdb->get_var($query);
                     if (!empty($single_variation_id)) {
                         $single_variations[] = $single_variation_id;
                         unset($query_variation[$attribute_code]);
                     }
                 }
             }
         } else {
             // Get combined variations
             $query = $wpdb->prepare("SELECT ID FROM " . $wpdb->postmeta . " AS P_META INNER JOIN " . $wpdb->posts . " as P ON ((P.ID = P_META.post_id) AND (P.post_parent = %d)) WHERE P_META.meta_key = '_wpshop_variations_attribute_def' AND P_META.meta_value = '" . serialize($query_variation) . "'", $product_id);
             $combined_variation_id = $wpdb->get_var($query);
             if (!empty($combined_variation_id)) {
                 $combined_variations[] = $combined_variation_id;
             }
         }
         //If all required variations are not selected
         if (!$all_required_variations_selected || $no_selected_variation) {
             $product_to_add_to_cart['text_from'] = 'on';
             // If we choose to display lower price variation combinaison
             if (empty($product_variation_configuration) || !empty($product_variation_configuration) && empty($product_variation_configuration['options']) || !empty($product_variation_configuration) && !empty($product_variation_configuration['options']) && !empty($product_variation_configuration['options']['price_display']) && !empty($product_variation_configuration['options']['price_display']['lower_price'])) {
                 //Get lower price variation combinaison
                 $lower_price_variations = wpshop_prices::check_product_lower_price($product_id);
                 if (!empty($lower_price_variations['variations']) && is_array($lower_price_variations['variations'])) {
                     foreach ($lower_price_variations['variations'] as $lower_price_variation) {
                         $product_to_add_to_cart[$product_id]['variations'][] = $lower_price_variation;
                     }
                 }
                 $product_to_add_to_cart['display_lower_price'] = true;
             } else {
                 $product_to_add_to_cart[$product_id]['variations'] = array();
             }
         } else {
             $product_to_add_to_cart['text_from'] = '';
             $product_to_add_to_cart[$product_id]['variations'] = !empty($product_variation_type) && $product_variation_type == 'single' ? $single_variations : $combined_variations;
         }
     }
     return $product_to_add_to_cart;
 }